Redis 和 MySQL 数据不一致性
Redis 和 MySQL 数据不一致性#
具体如何去解决还得结合业务去综合考虑。
下面几个方式可能比较通用
1. 双删法#
写流程
- 先删除缓存
- 写更新数据库
- 再次删除缓存 => 避免在第二步的时候有读请求访问数据库,然后把旧的值写入到缓存中
读流程
- 先读缓存
- 缓存没有就读数据库
- 更新缓存
这其实是一种懒加载,即只有当读的时候才会从数据库把最新的值加载到缓存里,是读流程激活的加载,而不是写流程在写入新值的时候自动刷新加载
主动加载的话,万一多个并行操作同时对一个key进行更新,需要考虑操作的幂等性,采用MQ的分区机制来保证同一分区内的操作都是顺序串行化执行
双删失败如何处理?
- 设置缓存过期时间,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案
- 重试 => 重试有业务通过mq重试以及组件消费mysql的binlog再写入mq重试两种方式
2. 异步延迟删除#
在双删的基础上,采用 异步延迟删除
- 先删除缓存
- 写更新数据库
- 触发异步写入串行化MQ(也可以采取一种key+version的分布式锁
- MQ接受再次删除缓存