如何解决 Redis 缓存与 MySQL 的数据一致性问题?

回答·104
最热
最新
  • 延时双删策略 1.删除 redis 缓存 2.数据库操作数据 3.该线程睡眠 thread.sleep(1000); 4.删除 redis 缓存 ES 同理
  • 1、采用延时双删处理 具体步骤:先删除缓存,再写数据库,休眠一段时间(读数据业务耗时+redis 和数据库主从同步耗时),再次删除缓存 缺点:1)休眠时间的估算准确性 2)增加了写请求的耗时 2、异步消息处理 先读 redis,然后写 mysql,然后更新 redis 集群服务器数据。 将更新数据发送到消息队列,redis 服务器订阅更新数据,然后同步更新。 缺点:需要部署消费代码同步数据,有一定的开发量
  • 2022 年了,兄弟,还在谈这个问题,基本无解,单机 redis 还有戏,集群模式,用 zk 别扯什么 删写删 写删删读 没啥用啊,加一个 cannle 也没鸟用, 讲真,我一直有个 idea.自己懒从来没动手,你可以试试,就是动态 key当然 ex 是必要的
  • 讨论 redis 和 mysql 一致性的都是菜鸟。 什么叫缓存? 缓存就是为了数据在一定时间范围内不变化。 要求墙一致性,你用缓存干嘛呢? 况且,强一致性真的存在吗?对于客户端来说,可以,比如等待,排队。对于服务器端数据同步,即使 raft 也有延迟。 Cap 理论大家记得吧?也是 3 选 2 的。 一致性,只能是最终一致性,或者是逐渐趋向于强一致性。 肯定有人会说什么订单库存场景,需要强一致性。 Redis 的目的主要是扛流量,高并发,防止流量查询 mysql,你把 redis 数据删了,流量全都涌入 mysql,能行吗? 难道还要加个排队?还要控制?那就违背了高并发了。
  • 延时双删,删除 redis 缓存,更新 mysql 数据,sleep 睡眠 1 秒,再次删除 redis 缓存
  • 通过 cannal 等工具,把数据库 binlog 打到 kafka,然后通过 kafka 跟踪数据库的变化,同步更新 redis 缓存,但是数据库有大批量操作的时候,容易出现很高的延时,所以,业务程序里也要写程序主动更新 redis,这样就构成双保险,除非有大批量操作导致了数据库到 redis 同步高延迟,业务程序里有没有成功的更新 redis,才容易出现数据不一致的情况
  • 1.在代码层次执行完增删改后执行 redis 更新。基本没啥优点。代码侵入性高。在并发下还有可能数据不一致 2.基于消息中间件,增删改后将增删改对应表和对应的数据唯一标示放入对列。然后在通过对列消息内容查询数据库更新 redis 3.监听数据库更改来实现 redis 更新。记得阿里有一个产品可以做到。好像是监听数据库日志来实现 4.以上三种方案基本是数据极短时间的数据一致性。还有基于定时调度任务定时对在周期内更新或新增及删除的信息同步至 redis 个有个的优点。开发过程中一般会根据实际情况来选择,或组合使用
  • 上面回答只是回答对了一部分。如果是面试人家会继续问。 如果是高并发情况下,要采用数据库与缓存更新与读取操作进行jvm队列异步串行化。
  • >1 如果是 rediscluter 集群 因为 rediscluter 集群采用异步复制,在故障切换的过程中删除操作有可能丢失,所以只是删除缓存操作是有可能 redismysql 不一致的,需要根据业务做特殊处理。 2 如果是单机 redis 在更新数据的时候先加写锁,然后删除缓存,在加载缓存的时候加读锁,可有避免数据在修改过程中其他线程加载旧数据到 redis
  • 不考虑场景怎么回答的了?我不知道为什么有这么多说延时双删的,如果你的数据库是一主多从,程序读写分离,在同步延时不确定的情况下,延时双删能保证什么,你这个延时到底应该延多久?这个问题说的太简单,其实业务上是一个很大的课题,数据是否需要高及时性?能接受略有延时的话监听 binlog 异步刷新缓存自然也是一种方案,如果要求更低,自动过期又有什么不可以?访问量又是多少,也会影响缓存到底是直接删除还是异步替换?你一个 QPS 几万的访问,直接删除缓存不是人为造成数据穿透吗,这能合理吗