Redis 和 MySQL 数据不一致性

Redis 和 MySQL 数据不一致性#

参考地址

具体如何去解决还得结合业务去综合考虑。

下面几个方式可能比较通用

1. 双删法#

写流程

  1. 先删除缓存
  2. 写更新数据库
  3. 再次删除缓存 => 避免在第二步的时候有读请求访问数据库,然后把旧的值写入到缓存中

读流程

  1. 先读缓存
  2. 缓存没有就读数据库
  3. 更新缓存

这其实是一种懒加载,即只有当读的时候才会从数据库把最新的值加载到缓存里,是读流程激活的加载,而不是写流程在写入新值的时候自动刷新加载

主动加载的话,万一多个并行操作同时对一个key进行更新,需要考虑操作的幂等性,采用MQ的分区机制来保证同一分区内的操作都是顺序串行化执行

双删失败如何处理?

  1. 设置缓存过期时间,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案
  2. 重试 => 重试有业务通过mq重试以及组件消费mysql的binlog再写入mq重试两种方式

2. 异步延迟删除#

在双删的基础上,采用 异步延迟删除

  1. 先删除缓存
  2. 写更新数据库
  3. 触发异步写入串行化MQ(也可以采取一种key+version的分布式锁
  4. MQ接受再次删除缓存
posted @ 2022-03-22 15:27  piaobodeyun0000  阅读(82)  评论(0编辑  收藏  举报