Redis 支持为每个 key 设置 TTL(Time To Live,生存时间),时间一到,key 会被删除。但是,过期不等于马上删除,删除的时机和方式由 Redis 控制,主要分为以下三种机制:
当 Redis 达到配置的内存最大值(maxmemory
)时,如果继续写入数据,Redis 会根据设置的淘汰策略决定如何处理。核心原则:优先删除不重要的数据,保证系统可用。
策略 | 描述 |
---|---|
noeviction(默认) | 不删除任何数据,写操作会直接返回错误。适合纯缓存场景以外的严肃业务 |
volatile-lru | 只对设置了过期时间(TTL)的 key 使用 LRU 算法淘汰 |
allkeys-lru | 所有 key 中使用 LRU 淘汰 |
volatile-random | 随机淘汰设置了 TTL 的 key |
allkeys-random | 随机淘汰所有 key |
volatile-ttl | 优先淘汰即将过期的 key(TTL 小的先被淘汰) |
allkeys-lfu | 基于访问频率(LFU)淘汰所有 key(Redis 4.0+) |
volatile-lfu | 基于访问频率淘汰带 TTL 的 key(Redis 4.0+) |
对比项 | 过期删除机制 | 内存淘汰策略 |
---|---|---|
触发条件 | key 达到过期时间 | Redis 内存达到 maxmemory 限制 |
主动性 | 主动(定期任务)+ 被动(访问时检查) | 只有达到内存上限才触发 |
清理范围 | 只清理设置了 TTL 的 key | 根据策略决定清理范围(可全局或 TTL 内) |
影响 | 防止内存被过期数据撑爆 | 保证系统可用,避免 OOM(内存溢出) |
✅ 设置合理的 maxmemory
,避免 Redis 被打爆。
✅ 缓存型业务推荐 allkeys-lru
,保证热点数据常驻内存。
✅ 高频限流或验证码场景可用 volatile-ttl
,优先清理快过期的数据。
✅ 持久化业务(AOF/RDB)慎用淘汰,防止数据丢失。
✅ 监控 used_memory
和 evicted_keys
,及时发现内存压力。
maxmemory 2gb
maxmemory-policy allkeys-lru
查看当前策略:
127.0.0.1:6379> CONFIG GET maxmemory-policy
过期删除是为了让“该死的数据死掉”,内存淘汰是为了防止“所有数据一起拖垮系统”。两者配合,保证 Redis 既轻盈又高效。