Redis缓存和数据库双写一致性
参考博客:https://www.cnblogs.com/12lisu/p/16090034.html
两种一致性:
1、最终一致性 2、强一致性:不能放缓存
常见方案
缓存的主要目的是为了提升查询的性能
**1. 用户请求过来之后,先查缓存有没有数据,如果有则直接返回。
- 如果缓存没数据,再继续查数据库。
- 如果数据库有数据,则将查询出来的数据,放入缓存中,然后返回该数据。
如果数据库也没数据,则直接返回空。**
目前有以下4种方案:先写缓存,再写数据库
- 先写数据库,再写缓存
- 先删缓存,再写数据库
- 先写数据库,再删缓存(推荐)
先写数据库,再删缓存(推荐方案)
如果删除缓存失败,需要加重试机制
在接口中如果更新了数据库成功了,但更新缓存失败了,可以立刻重试3次。如果其中有任何一次成功,则直接返回成功。如果3次都失败了,则写入数据库,准备后续再处理。
1、同步重试,该接口并发量比较高的时候,可能有点影响接口性能。
2、异步重试,mq重试
当用户操作写完数据库,但删除缓存失败了,产生一条mq消息,发送给mq服务器。
mq消费者读取mq消息,重试5次删除缓存。如果其中有任意一次成功了,则返回成功。如果重试了5次,还是失败,则写入死信队列中。
推荐mq使用rocketmq,重试机制和死信队列默认是支持的。使用起来非常方便,而且还支持顺序消息,延迟消息和事务消息等多种业务场景。
当然在该方案中,删除缓存可以完全走异步。即用户的写操作,在写完数据库之后,不用立刻删除一次缓存。而直接发送mq消息到mq服务器,然后有mq消费者全权负责删除缓存的任务。
还没有评论,来说两句吧...