双写不一致 指的是redis中的数据和数据库中的数据不一致的问题
1. 原因分析
(1) “修改 DB 更新缓存”场景
数据库里面的库存为 10
请求a 请求删除3个库存
数据库更新 库存为7
请求b 请求删除5个库存
数据库更新 库存为2
redis更新 缓存为2
这时请求a的redis更新 缓存更新为7 (出问题了)
(2) “修改 DB 删除缓存”场景
2. 如何解决
原因出现了 两个请求的并行处理
(1) 解决方案:延迟双删
延迟双删方案是专门针对于“修改 DB 删除缓存”场景的解决方案。但该方案并不能彻 底解决数据不一致的状况,其只可能降低发生数据不一致的概率。 延迟双删方案是指,在写操作完毕后会立即执行一次缓存的删除操作,然后再停上一段 时间(一般为几秒)后再进行一次删除。而两次删除中间的间隔时长,要大于一次缓存写操 作的时长
(2) 解决方案:队列
以上两种场景中,只所以会出现数据库与缓存中数据不一致,主要是因为对请求的处理 出现了并行。只要将请求写入到一个统一的队列,只有处理完一个请求后才可处理下一个请 求,即使系统对用户请求的处理串行化,就可以完全解决数据不一致的问题,如果是分布式系统,可以使用分布式队列
缺点:把并发执行的请求变成了串行执行,会导致性能下降
(3) 解决方案:分布式锁
使用队列的串行化虽然可以解决数据库与缓存中数据不一致,但系统失去了并发性,降 低了性能。使用分布式锁可以在不影响并发性的前提下,协调各处理线程间的关系,使数据 库与缓存中的数据达成一致性。
只需要对数据库中的这个共享数据的访问通过分布式锁来协调对其的操作访问即可