缓存一致性问题解决方案

双写模式

这里是引用
双写模式顾名思义就是两次写,写两次。数据进行更新时,第一次写是写数据库(修改数据库),第二次写是写缓存(更新缓存)。
但是在大并发下还是会出现问题,如下图
在这里插入图片描述
1号线程要写数据库,修改完后,要写缓存,可是就在中间的这段时间由于各种原因延误了,然后2号线程在这个延误时间内成功的写数据库并且写缓存,2号线程写完之后,1号线程才写缓存,这样就会导致脏数据的产生。
但是这种脏数据只是暂时性的,因为等到缓存过期后,他会自动更新缓存,最终达到一致。这个时间由我们来决定,一分钟,一小时,一天,根据数据的实时性来决定自动更新缓存的时间。
如果我们我们对实时性要求很高的话,也可以通过加锁来实现,第一个写未完成的话,不会释放锁,完成的话才让第二个写任务执行。话说回来,一般实时性要求很高的数据也不会被放到缓存中。

失效模式

这里是引用
失效模式:写完数据库,把缓存直接删掉,等到下一次请求数据时,再把数据放到缓存中。
但是在大并发情况下,还是会导致问题,场景如下。
在这里插入图片描述
1号线程写数据,然后删除缓存。2号线程写数据库,删除缓存,但是如果2号线程的写操作很慢的话,这个时候三号线程读缓存的话,发现缓存没命中,就会从db中查,读到的是1号线程修改的数据,然后进行更新缓存,这个缓存中的数据还是脏数据,因为2号线程还没写完。
也可以通过加锁来解决。但是会让系统变得慢,毕竟要等写线程释放锁。

总结

综上,我们放入缓存的数据本就不应该是一致性和实时性要求很高的数据。所以缓存的数据加上过期时间,定期更新缓存即可,确保每天或者没几个小时拿到的是最新数据即可,害怕出现脏数据,就加读写锁来解决。
如果遇到实时性和一致性要求高的数据,就应该查数据库,虽然慢点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值