Redis 过期策略详解

Redis 过期策略详解

Redis 设置了过期时间后,怎么删除过期的 key?这就涉及过期策略。

1. 设置过期时间

# 设置过期时间(秒)
set name "张三" ex 60

# 给已有key设置过期时间
expire name 60

# 查看剩余时间
ttl name

# 移除过期时间
persist name

2. 两种过期策略

1)惰性删除

  • 等到访问这个 key 的时候才检查是否过期
  • 过期了就删除,返回 nil
  • 优点:对 CPU 友好
  • 缺点:对内存不友好,很多过期 key 没被访问就占着内存

2)定期删除

  • 每隔一段时间,随机检查一些 key
  • 发现过期的就删除
  • 优点:定期清理,控制内存
  • 缺点:随机抽查可能漏

Redis 实际是两种策略结合用。

3. 内存淘汰策略

当内存满了,写入新数据时怎么办?

# 查看当前淘汰策略
config get maxmemory-policy

常用淘汰策略:

  • noeviction: 不淘汰,写入报错(默认)
  • allkeys-lru: 所有 key 中淘汰最久没用的
  • allkeys-random: 所有 key 中随机淘汰
  • volatile-lru: 只在设置了过期时间的 key 中淘汰最久没用的
  • volatile-random: 只在设置了过期时间的 key 中随机淘汰
  • volatile-ttl: 淘汰即将过期的 key

生产推荐:allkeys-lru

4. LRU 和 LFU

  • LRU(最近最少使用): 淘汰最久没访问的
  • LFU(最不经常使用): 淘汰访问次数最少的

Redis 4.0 开始支持 LFU。

5. 实际使用建议

  1. 设置合理的 maxmemory

    • 不要让 Redis 把内存占满
    • 一般设为服务器内存的 70%
  2. 选择合适的淘汰策略

    • 纯缓存场景:allkeys-lru
    • 有持久化数据:volatile-lru
  3. key 一定要设过期时间

    • 重要数据不要设过期
    • 缓存数据都要设过期时间
  4. 监控内存使用

    • 用 info memory 查看
    • 关注 used_memory 指标

6. 查看内存信息

# 查看内存使用
info memory

# 查看key数量
dbsize

# 查看大key
--bigkeys

总结

Redis 过期策略要点:

  • 惰性删除:访问时才删
  • 定期删除:定期抽查清理
  • 两种策略结合使用
  • 内存满了要配置淘汰策略
  • 生产推荐 allkeys-lru
  • 缓存数据都要设过期时间
  • 监控内存使用情况

搞懂过期策略,Redis 用起来才不踩坑。


emer 发布于  2026-10-9 07:11