blog:cache:consistency-question

缓存一致性问题

一致性

  • 强一致性
  • 弱一致性
  • 最终一致性

一致性问题描述

  • 先更新数据库,再删除缓存
    • 更新数据库成功,删除缓存失败。导致业务一直读取到错误的值
  • 先删除缓存,再更新数据库
    • 删除缓存成功,但是在更新成功数据库之前,有新的请求获取缓存值。发生缓存缺失。这个时候读取到数据库中的旧值存放在缓存中。
  • 业务服务将数据写入数据库,不写缓存。当需要读取记录的时候,缓存缺失。将数据库中的值缓存到缓存系统。这个时候不存在一致性问题
  • 如果发生删改操作,应用既要更新数据库,也要在缓存中删除数据。这两个操作如果无法保证原子性,也就是说,要不都完成,要不都没完成,此时,就会出现数据不一致问题了

问题解决方案

  • 可以把要删除的缓存值或者是要更新的数据库值暂存到消息队列中(例如使用 Kafka 消息队列)。当应用没有能够成功地删除缓存值或者是更新数据库值时,可以从消息队列中重新读取这些值,然后再次进行删除或更新。

参考链接

  • blog/cache/consistency-question.txt
  • 最后更改: 2022/04/28 11:54
  • okami