目录
三种缓存更新策略
-
内存淘汰(Eviction)策略:Redis在内存不足时,会根据预设的策略选择一些键进行淘汰,释放内存空间。Redis默认提供了以下几种淘汰策略:
当数据超出可用内存时,Redis将根据配置的淘汰策略进行自动选择。你不需要手动指定淘汰策略,除非你希望自定义新的淘汰策略。
- LRU(Least Recently Used,最近最少使用):淘汰最长时间未被访问的键。
- LFU(Least Frequently Used,最不经常使用):淘汰访问频率最低的键。
- Random(随机):随机选择键进行淘汰。
-
超时剔除(TTL,Time To Live):在向Redis存储数据时,可以为每个键设置一个过期时间。一旦过期时间到达,该键会自动被Redis删除。超时剔除策略是一种主动更新策略,适用于需要在一定时间后自动移除数据的场景。
-
主动更新:当你在操作数据库时,同时对Redis进行操作,以保持数据的一致性。这可以通过在操作数据库之后,更新或重置对应的Redis键值对来实现。
业务场景:
低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存
高一致性需求:主动更新,并以超时剔除作为兜底方案。例如店铺详情查询的缓存
主动更新的三种实现
操作缓存和数据库时有三个问题
1.删除缓存还是更新缓存?
更新缓存:每次更新数据库都更新缓存,无效写操作较多(不建议采用)
删除缓存:更新数据库时让缓存失效,查询时再更新缓存
2.如何保证缓存与数据库的操作的同时成功或失败?
单体系统,将缓存与数据库操作放在一个事务
分布式系统,利用TCC等分布式事务方案
3.先操作缓存还是先操作数据库?
一定要先操作数据库,再删除缓存,如果先删除缓存,再操作数据库在多线程的情况下,会导致缓存拿到数据库旧的数据
缓存更新策略的最佳实践方案:
1.
低一致性需求:使用
Redis
自带的内存淘汰机制
2.
高一致性需求:主动更新,并以超时剔除作为兜底方案
读操作:
•
缓存命中则直接返回
•
缓存未命中则查询数据库,并写入缓存,设定超时时间
写操作:
•
先写数据库,然后再删除缓存
•
要确保数据库与缓存操作的原子性