- URL: https://mp.weixin.qq.com/s?__biz=MzI2NDU4OTExOQ==&mid=2247685208&idx=1&sn=e0315649a49533d67f56c7006dbafc53&chksm=eaa60e08ddd1871e9912dc71205460256af4f72f6561090c651f9920720991ae0986bc24ce70&scene=21#wechat_redirect
- Added At: 2024-11-14 13:04:53
- Link To Text
本文探讨了缓存的意义、一致性挑战、更新策略,以及如何保证最终一致性,并介绍了消息中间件和订阅binlog等解决方法。
-
缓存的意义:
- 使用空间换时间,通过更高速的空间(如Redis)提升读性能。
- 更快的存储介质,如Redis,和本地内存(一级缓存)。
-
一致性挑战:
- 缓存和数据库之间的一致性问题,由于两者没有事务保证,可能出现数据不一致。
- 一致性问题无法完全消除,但可通过设计减少不一致时间窗口。
-
更新缓存手段:
- cache-aside策略:优先查询缓存,查询不到才查询数据库。
- 更新策略:包括更新数据库后更新缓存、更新数据库前更新缓存、更新数据库后删除缓存、更新数据库前删除缓存。
-
不一致性问题分析:
- 更新数据库后更新缓存:可能出现数据库更新成功但缓存未更新成功的情况。
- 更新缓存后更新数据库:可能出现缓存更新成功但数据库未更新成功的情况。
- 删除缓存:可能出现删除缓存操作失败的情况。
-
最终一致性保证:
- 缓存设置过期时间:通过设置缓存过期时间,即使更新失败,最终也能达到一致。
-
减少删除/更新失败:
- 消息中间件:利用消息中间件的机制,如ATLEAST-ONCE机制,减少删除/更新失败。
-
处理复杂的多缓存场景:
- MQ消息:通过MQ消息将更新缓存的操作发送出去,由不同系统订阅并处理。
-
订阅MySQL binlog:
- Canal:利用Canal订阅数据库binlog变更,集中处理缓存更新。