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

 更新时间:2026年02月28日 09:35:40   作者:rchmin  
Redis通过惰性删除和定期删除策略管理过期数据,结合内存淘汰策略有效处理大量带有过期时间的Key,确保高效性和稳定性,下面就来介绍一下如何使用,感兴趣的可以了解一下

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过期删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用RediSearch实现在Redis中全文检索

    使用RediSearch实现在Redis中全文检索

    RediSearch 是 Redis 的一个插件,它为 Redis 数据库添加了全文搜索和查询功能,使开发人员能够在 Redis 中高效地执行全文检索操作,下面我们就来看看是具体如何使用的吧
    2023-08-08
  • Redis实现分布式锁详解

    Redis实现分布式锁详解

    这篇文章主要介绍了redis如何实现分布式锁,文章中有详细的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-04-04
  • 浅谈redission锁的默认失效时间

    浅谈redission锁的默认失效时间

    Redisson是一个基于Redis的Java驻留库,提供了许多分布式对象和服务,包括分布式锁,本文主要介绍了浅谈redission锁的默认失效时间, 具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 记录一次并发情况下的redis导致服务假死的问题解决

    记录一次并发情况下的redis导致服务假死的问题解决

    由于Redis需要依赖于操作系统环境,如果系统资源受限,比如过量的进程在挤占系统资源、系统死锁等情况,本文主要介绍了记录一次并发情况下的redis导致服务假死的问题解决,感兴趣的可以了解一下
    2023-09-09
  • 一文详解消息队列中为什么不用redis作为队列

    一文详解消息队列中为什么不用redis作为队列

    这篇文章主要介绍了消息队列中为什么不用redis作为队列的相关资料,文章详细介绍了Redis的List和Pub/Sub数据类型在队列中的应用,包括如何处理消息积压和数据丢失等问题,通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • Redis KEYS查询大批量数据替代方案

    Redis KEYS查询大批量数据替代方案

    在使用 Redis 时,KEYS 命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞 Redis 服务,本文将介绍SCAN命令、有序集合、哈希表和RediSearch模块四种替代 KEYS 的高效方案,需要的朋友可以参考下
    2024-12-12
  • Redis恢复被移除集群的服务器实操步骤

    Redis恢复被移除集群的服务器实操步骤

    这篇文章主要为大家介绍了Redis恢复被移除集群的服务器实操步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 简单聊一聊redis过期时间的问题

    简单聊一聊redis过期时间的问题

    在使用redis的过期时间时不由想到设置了过期时间,下面这篇文章主要给大家介绍了关于redis过期时间问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • redis实现共同好友的思路详解

    redis实现共同好友的思路详解

    微信朋友圈大家都玩过吧,那么朋友圈的点赞、评论只能看到自己好友的信息是怎么操作的呢?下面通过本文给大家分享下此功能的实现流程,对redis实现共同好友的方法感兴趣的朋友一起看看吧
    2021-05-05
  • redis性能优化之生产中实际遇到的问题及排查总结

    redis性能优化之生产中实际遇到的问题及排查总结

    这篇文章主要介绍了redis性能优化之生产中实际遇到的问题及排查总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论