双写一致性

Posted by Laiaike on 2024-06-05

双写一致性

集中式缓存的三种缓存读写策略

  1. Cache Aside
  2. Read/Write Through
  3. Write Back

数据库和缓存的一致性

双写一致性:写db和写redis的一致性,主要是确保更新数据库后,删除缓存这个操作能够正常执行。(可能有另一线程同时读数据,把脏数据读入缓存;也可能是一些网络故障之类的原因,导致删除缓存的操作失败)

延时双删

  • 先删除缓存
  • 更新数据库
  • 休眠一会(比如1秒),再次删除缓存。

假如A,B两个线程A操作写,B操作读。当A删除缓存之后,这个时候B发生cache miss,就会查询数据库然后更新到缓存。这个时候A更新数据库结束之后再次删除缓存即可,防止刚才B读请求带来的缓存脏数据。

休眠时间 = B读取业务逻辑数据的耗时 + 几百毫秒

重试删除缓存操作

  1. 写请求更新数据库
  2. 缓存因为某些原因,删除失败
  3. 把删除失败的key放到消息队列
  4. 消费消息队列的消息,获取要删除的key
  5. 重试删除缓存操作

同步binlog异步删除缓存

重试删除缓存操作,会造成业务代码入侵,可以通过数据库的binlog异步淘汰key。

mysql为例 可以使用阿里的canalbinlog日志采集发送到MQ(e.g.kafka)里面,然后编写一个简单的缓存删除消息者订阅binlog日志,根据更新log异步操作缓存,并且通过ACK机制确认处理这条更新log,保证数据缓存一致性