缓存与DB一致性问题

发布时间 2023-03-27 21:13:31作者: fchhk

造成这个问题的原因

首先这两个操作不是原子性的,在多线程环境下,当线程A从数据库中读到的数据是1,在往缓存里面更新缓存之前,线程B操作了这条数据更新成为2。并发带来的原子性问题就是出现这个问题的根本原因。

解决方案

  1. 强一致性
    • 延时双删:删除数据、更新redis的时候,等待其他线程把缓存更新好。可能出现新的问题就是不知道等待多久、不知道其他线程是否处理完毕。还需要他在代码里面写一些延时方案。
  2. 锁:把这两个操作变成原子性。性能就会有影响,违背用缓存的初衷。

如果真的有强一致性要求,就不用缓存。

最终一致性
  1. 缓存加过期时间

  2. 利用中间件
    canal
    canal

    消息中间件的可靠通信