Skip to content

第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

练习题 ​

  1. 创建三个 Key,分别设 10s/30s/60s 过期,用 TTL 观察。
  2. 配置 maxmemory 为 1MB,allkeys-lru,不断写入观察淘汰。
  3. 理解 TTL 返回 -1 和 -2 的区别。

把零散知识,整理成可以反复走的路。