当前位置: 首页 > ds >正文

Redis 系列之 Key 过期策略介绍

Redis 系列之 Key 过期策略介绍

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

在 Redis 中,Key 的过期策略是指管理键生命周期的机制。通过设置过期时间(TTL - Time To Live),Redis 能够自动删除那些已经过期的键,从而释放内存空间。这对于缓存场景尤为重要,因为它确保了数据不会永久性地占用内存,同时保持了系统的高效运行。

二、过期策略的核心概念
  1. 生存时间(TTL)

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

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

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

  1. 惰性删除(Lazy Deletion)

    • 工作原理:当一个键过期后,并不会立即被删除。只有在下一次访问该键时,Redis 才会检查其是否已过期。如果已经过期,则该键会被删除。
    • 优点
      • 减少了 CPU 和内存的使用,因为不需要频繁扫描和删除过期键。
      • 适用于对延迟不敏感的应用场景。
    • 缺点:过期键可能会在内存中存在较长时间,占用不必要的空间。
  2. 积极删除(Active Deletion)

    • 工作原理:Redis 定期运行后台任务,主动扫描并删除已经过期的键。这种策略确保了内存不会被过多的过期键占用。
    • 优点
      • 及时释放内存空间,避免过期键堆积影响系统性能。
      • 适用于高并发和对延迟敏感的应用场景。
    • 缺点:增加了 CPU 的负载,因为后台扫描任务需要一定的计算资源。
四、设置过期时间的命令

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

  1. EXPIRE key seconds

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

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

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

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

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

  1. TTL key

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

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

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

  • 管道(Pipeline)
    • 将多个命令一次性发送给 Redis 服务器,减少网络往返次数,提升性能。
    • 示例:
      import redisr = 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 的负载,因此在配置时应权衡系统资源的使用情况。
八、注意事项
  1. 过期时间的精度

    • 使用 PXPIREPEXPIREAT 命令可以设置更精确的过期时间,适用于需要严格控制时间的应用场景。
  2. 键不存在时的行为

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

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

Redis 提供了灵活的过期时间设置和多种删除策略,能够满足不同应用场景的需求。在实际使用中,应根据系统的负载情况和应用的特点来选择合适的命令和策略,以优化性能和资源利用率。

http://www.xdnf.cn/news/1119.html

相关文章:

  • 09.传输层协议 ——— TCP协议
  • kotlin的kmp编程中遇到Unresolved reference ‘java‘问题
  • 鸿蒙应用开发:如何修改APP名称与APP的图标
  • 物联网蓬勃发展是助力楼宇自控技术迈向成熟的关键
  • 中电金信联合阿里云推出智能陪练Agent
  • 智能指针之设计模式4
  • BPC电波授时技术
  • 什么是爬虫?——从技术原理到现实应用的全面解析 III
  • HTTP 请求头与请求体:数据存储的底层逻辑与实践指南
  • leetcode day36 01背包问题 494
  • react 父子组件通信 子 直接到父, 父 forwardref子
  • 基于扣子(Coze.cn)与火山引擎构建高性能智能体的实践指南
  • 【Linux网络与网络编程】07.应用层协议HTTPS
  • LLM 论文精读(二)Training Compute-Optimal Large Language Models
  • Docker 数据卷
  • UML概览
  • Spark与Hadoop之间的联系和对比
  • 成熟软件项目解决方案:360°全景影像显控软件系统
  • .NET仓储层在 using 块中创建 SqlSugarClient 的风险
  • python兴趣匹配算法
  • <四级英语词汇> 2025.4.22
  • Cesium学习笔记——坐标系统及坐标转换
  • 文献×汽车 | 基于 ANSYS 的多级抛物线板簧系统分析
  • 【深度学习】#8 循环神经网络
  • 日常记录-logback脱敏
  • 【扫描件批量改名】批量识别扫描件PDF指定区域内容,用识别的内容修改PDF文件名,基于C++和腾讯OCR的实现方案,超详细
  • 4.22学习总结
  • Spring Web MVC入门
  • Apache SeaTunnel:新一代开源、高性能数据集成工具
  • 【2025最新Java面试八股】如何理解MySQL的MVCC机制?