前言:为什么要有缓存更新策略呢?主要是因为把数据保存在缓存与数据库当中,如果对数据库数据做修改,缓存并不知道。也不会去更新,用户去查询的时候就查到了旧数据,造成数据的不一致。 缓存更新策略则是为了解决上述的问题。
内存剔除
- 说明
- 原本是Redis用来解决内存不足的问题,因为Reids是基于内存存储的,内存不像磁盘,内存是有限的。Redis内存会设置一个上限,如果存储的数据越来越多,可能会导致内存的不足,于是有了内存的淘汰机制(有好几种策略)当内存不足的时候触发这种策略,把一部分数据淘汰掉。
- 一致性
- 在一定程度上可以保证一致性,当内存不足时,把一部分数据淘汰掉。这一部分数据在Reids中没有,如果用户来查询这些数据, Redis中未命中,去查询数据库,在去更新Reids数据就一致了。但这种一致性不可控,不知道淘汰了哪些数据,什么时候淘汰。 还有就是内存充足的情况下,数据不会被淘汰,依然无法保证数据的一致性。
- 维护成本
- 低,全部由Redis自己去控制,
超时剔除
- 说明
- 给缓存数据添加TTL过期时间,到期后自动删除缓存,下次查询直接更新缓存。从而确保一致性。
- 一致性
- 强弱取决于设置TTL时间的长短。如果短一些(30分钟),更新频率好一点,如果为1天,更新频率就低一点。 也不是完全的一致,如果在这30分钟内,数据库发生改变,依然会有一段时间数据不一致。
- 维护成本
- 低,只要在原来的设置缓存的逻辑中添加过期时间就好了
主动更新
- 说明
- 自己编写业务逻辑 ,每当修改数据库数据的同时就去把缓存改掉。
- 一致性
- 比较好,但也不能完全保证数据的一致性,难免会有差错,但相比上面两种是比较好的。
- 维护成本
- 高。原来只需要编码,现在需要在更新数据的同时对缓存也更新。
业务场景
- 低一致性需求:长久不发生变化的数据,使用内存淘汰机制,例如店铺类型的查询缓存。
- 高一致性:主动更新,并以超时剔除作为兜底方案,例如店铺详情查询的缓存、优惠券缓存。
有任何想要讨论和学习的问题可联系我:577371067@qq.com 不足之处请大家指正。