Redis之Key过期策略的用法解读

 更新时间:2025年04月23日 08:59:21   作者:zru_9602  
这篇文章主要介绍了Redis之Key过期策略的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、什么是 Key 的过期策略?

在 Redis 中,Key 的过期策略是指管理键生命周期的机制。通过设置过期时间(TTL - Time To Live),Redis 能够自动删除那些已经过期的键,从而释放内存空间。

这对于缓存场景尤为重要,因为它确保了数据不会永久性地占用内存,同时保持了系统的高效运行。

二、过期策略的核心概念

生存时间(TTL)

  • TTL 表示一个键在 Redis 中存活的时间长度。
  • 可以通过 EXPIREPXPIRE 命令分别以秒和毫秒为单位设置 TTL。

过期时间戳(Expiry Timestamp)

  • 每个带有过期时间的键都会被赋予一个具体的过期时间戳,表示该键将在何时失效。
  • EXPIREATPEXPIREAT 命令分别以秒和毫秒为单位设置过期时间戳。

三、过期键的删除策略

Redis 提供了两种主要的策略来处理过期的键:

惰性删除(Lazy Deletion)

工作原理

  • 当一个键过期后,并不会立即被删除。
  • 只有在下一次访问该键时,Redis 才会检查其是否已过期。
  • 如果已经过期,则该键会被删除。

优点

  • 减少了 CPU 和内存的使用,因为不需要频繁扫描和删除过期键。
  • 适用于对延迟不敏感的应用场景。

缺点

  • 过期键可能会在内存中存在较长时间
  • 占用不必要的空间

积极删除(Active Deletion)

工作原理

  • Redis 定期运行后台任务,主动扫描并删除已经过期的键。
  • 这种策略确保了内存不会被过多的过期键占用。

优点

  • 及时释放内存空间,避免过期键堆积影响系统性能。
  • 适用于高并发和对延迟敏感的应用场景。

缺点

  • 增加了 CPU 的负载
  • 因为后台扫描任务需要一定的计算资源

四、设置过期时间的命令

Redis 提供了多种命令来设置键的过期时间:

EXPIRE key seconds

  • 以秒为单位设置键 key 的生存时间。
  • 示例:EXPIRE myKey 3600 表示 myKey 在 3600 秒后过期。

PXPIRE key milliseconds

  • 以毫秒为单位设置键 key 的生存时间,提供了更高的精度。
  • 示例:PXPIRE myKey 1800000 表示 myKey 在 1,800,000 毫秒(即 30 分钟)后过期。

EXPIREAT key timestamp

  • 设置键 key 的过期时间为指定的 Unix 时间戳(以秒为单位)。
  • 示例:EXPIREAT myKey 1728000000 表示 myKey 将在时间戳 1,728,000,000 对应的时间点过期。

PEXPIREAT key timestamp

  • 设置键 key 的过期时间为指定的 Unix 时间戳(以毫秒为单位)。
  • 示例:PEXPIREAT myKey 1728000000000 表示 myKey 将在时间戳 1,728,000,000,000 对应的时间点过期。

五、查询剩余生存时间

Redis 提供了两个命令来查询键的剩余生存时间:

TTL key

  • 返回以秒为单位的键 key 的剩余生存时间。
  • 示例:TTL myKey 可能返回 300,表示该键还有 300 秒未过期。

PTTL key

  • 返回以毫秒为单位的键 key 的剩余生存时间。
  • 示例:PTTL myKey 可能返回 180000,表示该键还有 180,000 毫秒(即 3 分钟)未过期。

六、批量设置和处理

在实际应用中,可能需要对多个键进行批量的过期时间设置或管理。为此,可以结合使用 Redis 的管道(Pipeline)功能来提高操作效率:

管道(Pipeline)

将多个命令一次性发送给 Redis 服务器,减少网络往返次数,提升性能。

示例:

import redis

r = redis.Redis(host='localhost', port=6379, db=0)
pipe = r.pipeline()

# 批量设置过期时间
pipe.expire('key1', 3600)
pipe.expire('key2', 3600)
pipe.expire('key3', 3600)

# 执行管道中的命令
pipe.execute()

七、选择合适的删除策略

在实际应用中,应根据具体需求和系统负载情况来选择过期键的删除策略:

惰性删除

  • 适用于对延迟不敏感、内存资源较为充足的场景。
  • 可以通过调整 maxmemorymaxmemory-policy 来优化内存使用。

积极删除

  • 适用于高并发、需要快速响应的应用场景。
  • 需要注意的是,积极删除会增加 CPU 的负载,因此在配置时应权衡系统资源的使用情况。

八、注意事项

过期时间的精度

  • 使用 PXPIREPEXPIREAT 命令可以设置更精确的过期时间,适用于需要严格控制时间的应用场景。

键不存在时的行为

  • 如果尝试对一个不存在的键设置过期时间,Redis 会返回错误。
  • 因此,在操作前应确保键的存在性,或使用 SET 等命令同时设置值和过期时间。

内存管理

  • 过期键不会立即被删除,而是会在一定时间内被 Redis 的后台任务清理。
  • 为了避免内存不足的问题,建议合理配置 maxmemory 和选择合适的内存淘汰策略。

总结

Redis 提供了灵活的过期时间设置和多种删除策略,能够满足不同应用场景的需求。

在实际使用中,应根据系统的负载情况和应用的特点来选择合适的命令和策略,以优化性能和资源利用率。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • redis客户端连接错误 NOAUTH Authentication required

    redis客户端连接错误 NOAUTH Authentication required

    本文主要介绍了redis客户端连接错误 NOAUTH Authentication required,详细的介绍了解决方法,感兴趣的可以了解一下
    2021-07-07
  • 如何使用注解方式实现 Redis 分布式锁

    如何使用注解方式实现 Redis 分布式锁

    这篇文章主要介绍了如何使用注解方式实现Redis分布式锁,文章围绕主题展开详细的内容介绍,教大家如何优雅的使用Redis分布式锁,感兴趣的小伙伴可以参考一下
    2022-07-07
  • redis 手机验证码实现示例

    redis 手机验证码实现示例

    本文主要介绍了redis 手机验证码实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 图解Redis主从复制与Redis哨兵机制

    图解Redis主从复制与Redis哨兵机制

    这篇文章主要介绍了图解Redis主从复制与Redis哨兵机制,今天分享一下Redis的持久化、事务、管道相关的知识点,需要的朋友可以参考下
    2023-03-03
  • Redis获取某个前缀的key脚本实例

    Redis获取某个前缀的key脚本实例

    这篇文章主要给大家介绍了关于Redis获取某个前缀的key脚本的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Redis的BitMap使用操作命令

    Redis的BitMap使用操作命令

    Redis 为我们提供了位图这一数据结构,每个用户每天的登录记录只占据一位,365天就是365位,仅仅需要46字节就可存储,极大地节约了存储空间,这篇文章主要介绍了Redis的BitMap使用操作命令,需要的朋友可以参考下
    2023-10-10
  • 解析Redis Cluster原理

    解析Redis Cluster原理

    redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式
    2021-06-06
  • 查看Redis内存信息的命令

    查看Redis内存信息的命令

    Redis 是一个开源、高性能的Key-Value数据库,被广泛应用在服务器各种场景中。本文介绍几个查看Redis内存信息的命令,包括常用的info memory、info keyspace、bigkeys等。
    2020-09-09
  • Redis Cluster集群收缩主从节点详细教程

    Redis Cluster集群收缩主从节点详细教程

    集群收缩的源端就是要下线的主节点,目标端就是在线的主节点,这篇文章主要介绍了Redis Cluster集群收缩主从节点详细教程,需要的朋友可以参考下
    2021-11-11
  • Redis发布订阅和实现.NET客户端详解

    Redis发布订阅和实现.NET客户端详解

    发布订阅在应用级其作用是为了减少依赖关系,通常也叫观察者模式。主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方。下面这篇文章主要给大家介绍了关于Redis发布订阅和实现.NET客户端的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论