缓存与数据库一致性解决方案

如何保证缓存与数据库的双写一致性?

最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。
读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
更新的时候,先更新数据库,然后再删除缓存。

为什么是删除缓存,而不是更新缓存?

其实删除缓存,而不是更新缓存,就是一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。像 mybatis,hibernate,都有懒加载思想。查询一个部门,部门带了一个员工的 list,没有必要说每次查询部门,都把里面的 1000 个员工的数据也同时查出来啊。80% 的情况,查这个部门,就只是要访问这个部门的信息就可以了。先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询 1000 个员工。

这种先更新数据库再删缓存也会出现数据不一致的情况

先更新数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致,这还是有问题的

如果是先删缓存再更新数据库呢

在高并发的情况下也会出现不一致的情况
比如线程1先删除了缓存的数据,还没来得及更新数据库,此时线程2来读数据,缓存里面没有,就读数据库,然后把数据更新进缓存,此时线程1开始更新数据库,此时缓存里面是老数据,数据库里面是新数据,出现缓存不一致的情况。

解决方案一 延迟双删策略

在这里插入图片描述
在这里插入图片描述

解决方案二 异步更新缓存

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

说简单点就是将读请求和写请求串行化放进一个队列中去,让他们按顺序执行
比如我现在有个更新的请求,我将它放进一个队列,开启一个异步的线程让它去消费队列,我先删除缓存,还没来得及更新数据库的时候,来了一个读请求,将它放进队列去,排在更新请求后面,它必须等更新请求操作完后才能执行,此时更新请求继续更新数据库,更新数据库后,读请求开始操作,先读缓存,缓存没有,然后读取数据库,把数据库的内容写进缓存,此时数据库和缓存还是一致的

猜你喜欢

转载自blog.csdn.net/qq_45100361/article/details/114003774