当前位置: 代码网 > it编程>数据库>Redis > Redis Key过期删除策略使用小结

Redis Key过期删除策略使用小结

2026年02月28日 Redis 我要评论
redis 的 key 过期数据删除策略是 redis 内存管理的关键部分,它通过两种主要策略相结合的方式清理过期数据:1.被动删除(惰性删除 - lazy expiration)工作原理:当客户端尝

redis 的 key 过期数据删除策略是 redis 内存管理的关键部分,它通过 两种主要策略 相结合的方式清理过期数据:

1.被动删除(惰性删除 - lazy expiration)

工作原理

  • 当客户端尝试访问某个 key 时,redis 会先检查该 key 是否已过期
  • 如果过期,则立即删除并返回 nil(就像 key 不存在一样)
  • 如果未过期,则正常返回数据

优点

  • cpu 友好,只在访问时消耗资源
  • 简单直接,不影响未访问的 key

缺点

  • 内存不友好,不访问的过期 key 会一直占用内存
  • 可能导致内存泄露(如果某些过期 key 永不被访问)

2.主动删除(定期删除 - periodic expiration)

工作原理
redis 会周期性地(默认每秒 10 次)执行以下操作:

  1. 随机测试:从设置了过期时间的 key 集合中随机选择 20 个 key
  2. 检查过期:删除其中所有已过期的 key
  3. 调整频率:如果超过 25% 的 key 已过期,则重复步骤 1-2
  4. 限制时间:每次扫描最多持续 25ms,避免阻塞主线程

配置参数(redis.conf):

# 每秒执行过期扫描的次数(默认 10)
hz 10
 
# 每次扫描的 cpu 时间百分比上限(默认 25%)
# 实际上每次扫描最多 25ms(1000ms/hz * 25%)

优点

  • 减少内存中过期 key 的堆积
  • 在 cpu 和内存之间取得平衡

缺点

  • 不是实时的,可能存在过期 key 未被及时清理
  • 增加了一定的 cpu 开销

3.内存淘汰策略(eviction policies)

当内存达到 maxmemory 限制时,redis 会根据配置的策略删除数据:

# 内存限制(默认不限制)
maxmemory <bytes>
 
# 淘汰策略
maxmemory-policy <policy>

淘汰策略选项

策略<policy>描述适用场景
noeviction不淘汰,返回错误数据绝对不能丢失
allkeys-lru从所有 key 中使用 lru需要缓存效果
volatile-lru从带过期时间的 key 中使用 lru混合使用
allkeys-random随机删除所有 key所有 key 同等重要
volatile-random随机删除带过期时间的 key混合使用
volatile-ttl删除即将过期的 key(ttl最小)优先保留新数据
allkeys-lfu从所有 key 中使用 lfu(4.0+)访问频率重要
volatile-lfu从带过期时间的 key 中使用 lfu(4.0+)混合使用

4.实际工作流程示例

5.性能优化建议

监控过期 key 数量

# 查看过期 key 相关信息
redis-cli info stats | grep expired_keys

合理配置

# 根据负载调整 hz 值
hz 100  # 更高频率(更及时清理,更高cpu)
hz 1    # 更低频率(更少cpu,可能堆积)

避免大量 key 同时过期

# 不好的做法:同时设置相同过期时间
for i in range(100000):
    redis.set(f"key:{i}", "data", ex=3600)

# 好的做法:添加随机偏移
for i in range(100000):
    redis.set(f"key:{i}", "data", ex=3600 + random.randint(0, 300))

6.特殊情况处理

aof/rdb 持久化

  • rdb:生成快照时,过期 key 不会被保存
  • aof:key 过期时,会追加一条 del 命令

主从复制

  • 主节点删除过期 key 后,会向从节点发送 del 命令
  • 从节点不会主动删除过期 key,只接受主节点指令

集群模式

  • 每个节点独立管理自己的过期 key
  • 迁移槽位时,过期信息一并迁移

总结

redis 的过期删除策略是 惰性删除 + 定期删除 的组合拳:

  • 惰性删除:保证访问的正确性
  • 定期删除:减少内存浪费
  • 内存淘汰:防止内存耗尽的最后防线

这种设计在 cpu 使用率、内存效率和实现复杂性之间取得了良好的平衡,使得 redis 能够高效处理大量带有过期时间的 key。

到此这篇关于redis key过期删除策略使用小结的文章就介绍到这了,更多相关redis key过期删除内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com