差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 | |||
blog:cache:consistency-question [2022/04/28 11:16] okami |
blog:cache:consistency-question [2022/04/28 11:54] (当前版本) okami [问题的产生] |
||
---|---|---|---|
行 7: | 行 7: | ||
- 最终一致性 | - 最终一致性 | ||
- | ====== 问题的产生 ====== | + | ====== |
+ | |||
+ | |||
+ | - 先更新数据库,再删除缓存 | ||
+ | - 更新数据库成功,删除缓存失败。导致业务一直读取到错误的值 | ||
+ | - 先删除缓存,再更新数据库 | ||
+ | - 删除缓存成功,但是在更新成功数据库之前,有新的请求获取缓存值。发生缓存缺失。这个时候读取到数据库中的旧值存放在缓存中。 | ||
+ | |||
+ | ===== 新增 ===== | ||
+ | |||
+ | - 业务服务将数据写入数据库,不写缓存。当需要读取记录的时候,缓存缺失。将数据库中的值缓存到缓存系统。这个时候不存在一致性问题 | ||
+ | |||
+ | ===== 删改 ===== | ||
+ | |||
+ | - 如果发生删改操作,应用既要更新数据库,也要在缓存中删除数据。这两个操作如果无法保证原子性,也就是说,要不都完成,要不都没完成,此时,就会出现数据不一致问题了 | ||
+ | |||
+ | ====== 问题解决方案 ====== | ||
+ | |||
+ | ===== 重试机制 ===== | ||
+ | |||
+ | - 可以把要删除的缓存值或者是要更新的数据库值暂存到消息队列中(例如使用 Kafka 消息队列)。当应用没有能够成功地删除缓存值或者是更新数据库值时,可以从消息队列中重新读取这些值,然后再次进行删除或更新。 | ||
+ | |||
+ | ===== 延时双删 ===== | ||
+ | |||
+ | ===== 读写锁 | ||
- | - 更新记录 | ||