Redis数据淘汰策略可以理解为Redis在内存不够用时,按照一定规则清理部分数据,为新数据腾地方,就像渣男提裤不认人,需要新欢时果断抛弃旧爱。
一、触发条件当Redis内存使用超过maxmemory配置值时,就会触发淘汰机制,根据配置的淘汰策略选择要清理的数据。
二、淘汰策略分类Redis4.0后提供8种策略,可分为4大类:
1. LRU(最近最少使用)- volatile-lru:从已设置过期时间的数据中,淘汰最近最少使用的。例:缓存新闻,优先保留热点新闻,淘汰冷门旧闻。
- allkeys-lru:从所有数据中淘汰最近最少使用的。例:全量缓存商品信息,优先保留高频访问商品。
2. LFU(最不经常使用)- volatile-lfu:从已设置过期时间的数据中,淘汰使用频率最低的。例:视频推荐缓存,淘汰长期无人点击的视频。
- allkeys-lfu:从所有数据中淘汰使用频率最低的。例:全局用户行为数据,保留高频交互用户。
3. Random(随机淘汰)- volatile-random:从已设置过期时间的数据中随机淘汰。例:临时任务队列,无优先级时随机清理。
- allkeys-random:从所有数据中随机淘汰。例:全量数据无热度差异时使用。
4. TTL(按过期时间)- volatile-ttl:淘汰即将过期的数据。例:会话缓存,优先保留存活时间长的会话。
5. 特殊策略- no-enviction(默认):禁止淘汰数据,内存不足时直接报错。例:金融数据等不允许丢失的场景。
三、策略选择建议- 优先LRU:适合有明显热点数据的场景(如热点新闻、商品)。
- 考虑LFU:适合数据访问频率差异大的场景(如视频推荐、用户行为)。
- 慎用Random:可能导致重要数据被误删。
- 默认no-enviction:仅在数据绝对不能丢失时使用。
四、过期键删除机制Redis通过3种方式清理过期键:
1. 定时删除- 原理:为每个过期键设置定时器,到期立即删除。
- 缺点:占用CPU资源,可能影响性能。
- 例:像闹钟一样准时清理,但闹钟太多会吵得CPU无法工作。
2. 惰性删除- 原理:访问键时检查是否过期,过期则删除。
- 缺点:可能内存泄漏(过期键长期未被访问)。
- 例:像懒人一样,只有用到时才清理,不用就不管。
3. 定期删除- 原理:每隔一段时间随机检查部分键并删除过期键。
- 平衡点:结合定时和惰性的优点,避免极端情况。
- 例:像定期大扫除,既不会太频繁,也不会完全不管。
五、持久化与复制中的过期键处理- RDB:生成文件时忽略过期键,载入时主服务器过滤过期键,从服务器全部载入后由主服务器同步删除。
- AOF:写入时忽略过期键,删除时追加DEL命令,重写时过滤过期键。
- 主从复制:主服务器删除过期键后通知从服务器删除,保证数据一致。
六、配置示例# 设置最大内存为2GBmaxmemory 2gb# 设置淘汰策略为allkeys-lrumaxmemory-policy allkeys-lru总结Redis的淘汰策略和过期键处理机制共同保证了内存的高效利用和数据的一致性。理解这些策略后,可以根据业务场景选择最合适的配置,避免内存溢出或重要数据丢失。就像渣男抛弃旧爱时也要讲策略——优先甩掉不重要的,保留有价值的,才能持续“撩新欢”嘛!