第06章:过期时间与内存淘汰
本章目标
理解过期删除策略 + 八种内存淘汰策略 + 选择合适的策略
6.1 设置过期时间
bash
EXPIRE key 60 # 60秒后过期
PEXPIRE key 60000 # 60000毫秒后过期
EXPIREAT key 1705300000 # 指定时间戳过期
SET key value EX 60 # 设置的同时设过期(推荐!)
TTL key # 剩余秒数(-1永不过期,-2不存在)
PTTL key # 剩余毫秒数
PERSIST key # 取消过期6.2 过期删除策略
Redis 用两种策略结合:
| 策略 | 机制 | 说明 |
|---|---|---|
| 惰性删除 | 访问 Key 时检查是否过期 | 过期了才删,不访问就不删 |
| 定期删除 | 每秒 10 次随机抽一批 Key 检查 | 补充惰性删除的遗漏 |
6.3 八种淘汰策略
bash
CONFIG GET maxmemory-policy| 策略 | 说明 | 适用场景 |
|---|---|---|
noeviction | 不淘汰,写满报错 | 一般不用 |
allkeys-lru | 所有 Key 中淘汰最久未使用的 | 缓存场景首选 |
volatile-lru | 有过期时间的 Key 中淘汰 LRU | 部分缓存+部分持久 |
allkeys-random | 所有 Key 随机淘汰 | 数据访问均匀 |
volatile-random | 有过期时间的随机淘汰 | 同上 |
volatile-ttl | 淘汰 TTL 最短的 | 快过期的先删 |
allkeys-lfu | 所有 Key 中淘汰最不频繁使用的 | 防热点数据被误删 |
volatile-lfu | 有过期时间的淘汰 LFU | 同上 |
📌 LRU vs LFU:LRU 看"多久没用",LFU 看"用了多少次"。LFU 更智能(4.0+)。
6.4 推荐配置
bash
# 缓存场景(最常用)
maxmemory 2gb
maxmemory-policy allkeys-lru
# 混合场景(有持久数据+有缓存)
maxmemory 2gb
maxmemory-policy volatile-lru常见错误
错误1:不设 maxmemory
Redis 内存无限增长 → OOM 被系统 kill → 数据丢失错误2:缓存场景用了 noeviction
bash
# noeviction:内存满了写入报错
# 缓存场景应该淘汰旧数据,让新数据进来错误3:大 Key 设过期导致阻塞
一个 ZSet 有 100 万条数据,过期时一次性删除 → 卡
Redis 4.0+ 用 UNLINK 异步删,6.0+ 过期删除也异步本章小结
SET key value EX seconds设值+过期(一条命令)- 过期 = 惰性删除 + 定期删除
- 缓存场景:
allkeys-lru - 混合场景:
volatile-lru
练习题
- 创建三个 Key,分别设 10s/30s/60s 过期,用 TTL 观察。
- 配置 maxmemory 为 1MB,allkeys-lru,不断写入观察淘汰。
- 理解 TTL 返回 -1 和 -2 的区别。