2024-03-13 18:02:26
Redis内存淘汰策略是当内存达到上限(maxmemory)时,通过特定规则清除部分键值对以释放内存的机制,确保新数据可以正常写入。 以下是详细说明:
一、为什么需要内存淘汰策略?Redis提供8种淘汰策略,分为不淘汰、LRU、LFU、随机、TTL五大类:
1. 不淘汰策略行为:禁止写入新数据(DEL等少数命令除外),直接返回错误。
适用场景:对数据一致性要求极高,且能接受写入失败的场景(如缓存穿透防护)。
风险:可能导致内存持续占用,需监控内存使用率。
allkeys-lru
行为:从所有键中淘汰最近最少使用的数据。
适用场景:缓存场景,且无法预估键的过期时间。
示例:社交媒体的热点新闻缓存,优先保留高频访问内容。
volatile-lru
行为:仅从设置了过期时间的键中淘汰最近最少使用的数据。
适用场景:需要保留永久键(如用户基础信息),仅清理临时缓存。
对比:比allkeys-lru更保守,可能减少永久键被误删的风险。
allkeys-lfu
行为:从所有键中淘汰访问频率最低的数据。
适用场景:长期热点数据保留(如电商商品库存)。
优势:避免LRU中“短期高频但长期低频”的键被误留。
volatile-lfu
行为:仅从设置了过期时间的键中淘汰访问频率最低的数据。
适用场景:临时缓存中需区分访问频率的场景(如促销活动页面)。
allkeys-random
行为:从所有键中随机淘汰数据。
适用场景:对数据访问模式无特殊要求,且需快速释放内存的场景。
风险:可能误删高频访问键,导致缓存命中率下降。
volatile-random
行为:仅从设置了过期时间的键中随机淘汰数据。
适用场景:临时缓存且无访问频率差异的场景(如验证码存储)。
行为:从设置了过期时间的键中淘汰剩余生存时间(TTL)最短的键。
适用场景:需要优先清理即将过期的数据(如会话管理)。
优势:减少内存占用,同时避免频繁更新TTL的计算开销。
每次回收时随机检查maxmemory-samples个键(默认5个),淘汰其中最久未访问的键。
Redis 3.0+引入候选键池,提升近似精度。
前16位:记录最后访问时间(类似LRU)。
后8位:Morris计数器,记录访问频率(非线性增长)。
递增:通过lfu-log-factor(默认10)控制增长速度(值越大,递增越慢)。
衰减:通过lfu-decay-time(默认1分钟)控制未访问时的削减速度(值越小,衰减越快)。
通过合理配置内存淘汰策略,Redis可在有限资源下最大化缓存效率,平衡性能与稳定性。