我试图了解有关缓存预留策略的一些信息。如果找到则从缓存中读取数据(缓存命中),如果未找到(缓存未命中)则从数据库读取数据+在缓存中更新。
在写入时,它被放入主数据库中,然后应该通过以下方式更新缓存:
- A : 删除缓存中对应的条目(这样下次读取会遇到缓存未命中并更新缓存)
- 或 B :更新缓存中的相应条目(因此,如果下一次读取发生在缓存条目 TTL 之前,则会遇到缓存命中)
我不明白解决方案A和B的优缺点是什么。使用redis,两者似乎实现起来都很简单,但我猜还有其他考虑因素。
这两种解决方案都试图使数据库更改尽快同步到缓存,即使数据库和缓存尽可能保持一致,以便应用程序代码可以读取(可能的)最新数据。
以下是每种解决方案的缺点。
解决方案A:删除缓存中的项目
如果该项目更新非常频繁,则此解决方案会始终删除缓存条目,并且您将遇到大量缓存未命中。大多数请求都会到达数据库,从而使缓存变得毫无用处。
解决方案 B:更新缓存中的项目
此解决方案可能会将不频繁的项目插入到缓存中,并降低缓存命中率。当数据库中的商品更新时,您不知道它是否是热门商品。如果它是冷项,并且将其插入到缓存中,则热项可能会从缓存中逐出(因为缓存大小有限)。
缓存不一致问题依然存在
虽然两种解决方案都试图尽可能让缓存保持一致。他们不能保证这一点。以下面的案例为例。
- 客户端A读取缓存,发现不存在。
- 客户端A读取数据库并获取值:旧值.
- 客户端 B 用新值更新数据库:新价值.
- 客户端 B 更新缓存新价值或删除缓存中的条目(尽管缓存中可能不存在)。
- 客户端 A 更新缓存旧值.
在这种情况下,缓存仍然保留旧值。
方案C:与不一致的人交朋友
由于您使用的是缓存,因此无法避免与数据库的不一致。所以在大多数情况下,我们在更新数据库时不需要更新/删除缓存项。查看this and this了解更多详情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)