Redis的双写一致性,笔者认为主要是关心多线程执行结束之后,redis中的缓存数据和数据库保持一致或者当前的redis是删除状态,等待下一查询数据的时候更新缓存,而不是关注多线程之间的线程安全问题。
Redis双写一致性发生场景,是在高并发的项目中出现的,普通的项目发生的概率很低,甚至不用考虑不一致情况的发生。
了解了什么是redis 的双写一致性,那么我们就分析如何最大可能的保证双写一致性。
-
先更新数据库再更新缓存
image.png
数据库store为6 redis为10
-
先删除缓存再更新数据库
image.png
数据库store为6 redis为10
-
先删除缓存在更新数据库(双删)
image.png
延时双删策略最终将redis删除掉,等下一次查询的时候会把最新的数据缓存到redis中,虽然解决了缓存不一致性,但是牺牲了性能,为了小概率事件,牺牲每一次访问效率,也不可取,当然也可以新开启一个线程去删除redis,
但是毕竟多了一个线程.
4.先更新数据库在删除缓存
image.png
数据库store为6 redis为10
那再项目中该如何保证双写一致性呢,笔者建议使用4,把原有的图更改一下
image.png
因为查询数据库的时间小于更新数据库的时间,很有可能先更新redis,再删除redis,这样保证了一致性。
如果对缓存一致性敏感的话,那只能使用锁机制,当然可以使用读写锁,保证效率。
网友评论