缓存数据库双写一致性

缓存以 Redis 为例

先写库,后写 Redis

每次写库操作都会更新 Redis,性能压力大,不如在读的时候更新 Redis

先写库,后删 Redis

问题:写库成功,删 Redis 失败,读数据的时候读到缓存

补偿措施:删失败的 key 放到消息队列,发送给 Redis,或直接订阅数据库的写操作日志

先写 Redis,后写库

同”先写库,后写 Redis“,对 Redis 压力过大

先删 Redis, 后写库

问题:

  1. 线程1删除 Redis,准备写库
  2. 线程2读取,发现 Redis 为空,读库后更新 Redis
  3. 线程1完成写库,库与 Redis 数据不一致

补偿措施:延时双删,删 Redis 过一段时候后,再删一次 Redis