> 文章列表 > Redis一致性问题

Redis一致性问题

Redis一致性问题

(1)何为一致性?

  • 1、定义:

    • 指系统中各节点数据保持一致。
      • 分布式系统中,可以理解为多个节点中的数据是一致的。
  • 2、分类:

    • 强一致性:写进去的数据是什么,读出来的数据就是什么。
    • 弱一致性:只保证到某个时间级别后,数据能达到一致。
      • 最终一致性:在某个时间点后数据会达到一致。

(2)Redis与数据库如何保证一致性?/Redis一致性问题?

  • 1、先删除缓存,再更新数据库;
  • 2、先更新数据库,再删除缓存;
  • 3、先更新缓存,再更新数据库;
  • 4、先更新数据库,再更新缓存;

(3)更新缓存和删除缓存如何选择?

  • 更新缓存:
    • 使用场景:数据使用较为频繁
  • 删除缓存:
    • 使用场景:数据使用频率不高

(4)先删除缓存,再更新数据库存在问题?及其解决方案?

Redis一致性问题

  • 存在问题:
    • 删除缓存成功,更新数据库失败:导致缓存中的数据被B更新为旧数据。
  • 解决方案:
    • 失败重试 + 延时双删:
      • 对于数据库更新失败,加入更新失败重试机制,数据库更新成功后,延时一段时间,再次删除缓存。

(5)先更新数据库,再删除缓存存在问题?及其解决方案?

  • 存在问题:
    • 更新数据库成功,删除缓存失败:此时缓存中为旧数据,导致其他线程读取到旧数据。
  • 解决方案:
    • 对于删除缓存失败:
      • 订阅binlog:数据库的每一步操作均会写入binlog日志,可以通过监听binlog,实时感知数据变化情况,根据数据变化情况删除redis并添加重试机制,直至redis删除成功。
      • 引入消息队列
        若Redis删除失败,则将Redis key放入消息队列,消费端监听消息队列并删除Redis直至删除成功。

(5)总结

  • 数据库更新失败:失败重试,延时双删。
  • 缓存删除失败:订阅binlog/引入消息队列。