双写一致性
集中式缓存的三种缓存读写策略
- Cache Aside
- Read/Write Through
- Write Back
数据库和缓存的一致性
双写一致性:写db和写redis的一致性,主要是确保更新数据库后,删除缓存这个操作能够正常执行。(可能有另一线程同时读数据,把脏数据读入缓存;也可能是一些网络故障之类的原因,导致删除缓存的操作失败)
延时双删
- 先删除缓存
- 更新数据库
- 休眠一会(比如1秒),再次删除缓存。
假如A,B两个线程A操作写,B操作读。当A删除缓存之后,这个时候B发生cache miss,就会查询数据库然后更新到缓存。这个时候A更新数据库结束之后再次删除缓存即可,防止刚才B读请求带来的缓存脏数据。
休眠时间 = B读取业务逻辑数据的耗时 + 几百毫秒
重试删除缓存操作
- 写请求更新数据库
- 缓存因为某些原因,删除失败
- 把删除失败的key放到消息队列
- 消费消息队列的消息,获取要删除的key
- 重试删除缓存操作
同步binlog异步删除缓存
重试删除缓存操作,会造成业务代码入侵,可以通过数据库的binlog异步淘汰key。
以mysql
为例 可以使用阿里的canal
将binlog
日志采集发送到MQ
(e.g.kafka)里面,然后编写一个简单的缓存删除消息者订阅binlog
日志,根据更新log异步操作缓存,并且通过ACK
机制确认处理这条更新log,保证数据缓存一致性
。