Redis缓存与数据库数据一致性问题
使用Redis缓存可以在极大程度上去缓解数据库的访问压力,但使用了Redis之后,就需要去保证缓存与数据库的数据一致性。
保证数据一致的方案有很多,列了延时双删、订阅更新机制、读写分离架构、通过binlog异步更新redis这几个推荐的方案,可根据实际情况具体选择。
Redis缓存与数据库数据一致性问题
方案一:延时双删(推荐)
在更新完db的数据之后,立马去删除一次redis的缓存,然后延时1~2秒,再去删除一次redis缓存。
目的: 避免并发操作,导致缓存脏数据问题的出现。
优点: 实现简单,可以有效解决大部分场景下的问题。即使第一次删除失败,第二次删除仍然有机会清除旧数据。
缺点: 延时的时间不好确定。
方案二:订阅更新机制
在更新完db数据之后,立刻向 消息队列
发送一条删除缓存数据的消息,消费者监听到这个消息后,立刻去执行缓存删除操作。
优点: 实时性好,缓存清理会非常及时。
缺点: 实现相对复杂,消息队列要求可靠性,保证消息不会丢失,有一定维护成本。
方案三:读写分离架构
比较适合大数量流量,数据实时性要求不那么高的系统。
更新完db数据之后,由后台线程、定时任务、异步服务等方法去更新redis缓存数据,达到缓存和数据库数据的基本一致。
优点: 缓存更新压力会降低很多。
缺点: 实现复杂,需要做好异步的逻辑。
方案四:通过binlog异步更新redis(推荐)
更新完db数据之后,数据库的 binlog
日志文件里会有相关的操作记录,然后可以通过 Cancel
去监听并解析binlog日志,然后将解析的数据通过 消息队列
发送一条缓存更新消息,消费者监听到这个消息后去更新redis缓存数据。
优点: 业务功能不会增加额外的代码,是扩展实现的。可以很好保证缓存与数据库数据的最终一致性。
缺点: 有一定的维护成本,需要保证消息的消费顺序。