如何保证Redis和MySQL数据的一致性刨析
1、常见的缓存更新策略:
定义:主要用来进行redis和mysql的数据同步更新的一些策略
- 内存淘汰:等触发淘汰机制后,刚好淘汰到了用户查询的数据,此时是null,会进行查询数据库并写入到缓存中,此时查询到的数据就是新的,但如果淘汰掉的不是用户查询的数据,每次用户都能够查询到数据,其实这个数据也就是旧数据,数据一致性较差。
- 超时剔除:和内存淘汰策略差不多
- 主动更新(主要应用策略):由程序员进行编码,在数据库进行更新时候手动更新缓存
2、主动更新策略:
3、主动更新第一个策略(CAP)
3.1、定义原理
由缓存的调用者在进行更新数据库的同时更新缓存。
更新数据:在进行数据库数据修改的时候,一般都是删除缓存,然后缓存为空,等待查询时候判空再进行数据库的查询然后更新缓存,而不是每次去做更新数据都进行更新缓存操作。
3.2、先操作缓存还是先数据库?
- 先删缓存、后更新数据库(弊端较大):假设一个线程删除了缓存,然后进行更新数据库,此时另外一个线程进行数据的查询,因为数据库操作比缓存操作慢,此时因为缓存未命中重新写入缓存,但是数据库还没更新完毕,此时获取到的数据仍是旧数据。
- 先更新数据库、后删除缓存:出现并发问题情况几乎没有,可能出现的问题就是刚好查询缓存时候,缓存失效,然后另外一个线程进行数据库更新,此时第一个线程已经将旧的数据重新写入缓存了。获取到的仍然是旧数据,但是发生的几率较低。
- 双写一致性(延迟双删)
- 流程:
更新数据库
删除 Redis 缓存
短暂延迟(如 500ms)后,再次删除缓存 - 目的:避免并发情况下 旧数据回写 Redis 的问题。
- 流程:
- 使用消息队列确保一致性:数据库更新后,发送消息消费消息,删除 Redis,确保 Redis 最终一致