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

Redis 过期策略 总结

前言


 相关系列

  • 《Redis & 目录》(持续更新)
  • 《Redis & 过期策略 & 源码》(学习过程/多有漏误/仅作参考/不再更新)
  • 《Redis & 过期策略 & 总结》(学习总结/最新最准/持续更新)
  • 《Redis & 过期策略 & 问题》(学习解答/持续更新)
     

 参考文献

  • 《Redis过期策略和淘汰策略》
     
     

概述


    过期策略用于控制过期数据的删除时机。在我们使用Redis保存数据的内存中,我们可能会出于某些原因为数据设置了过期时间,目的是为了令该数据可以在过期后自动删除。而过期策略就是Redis使用删除过期数据的具体手段。

    Redis同时通过“惰性删除/定期删除”过期策略来删除过期数据。惰性删除策略是对CPU友好的过期策略,但其删除效果相对不尽人意;而过期删除策略则是一种非常灵活的过期策略,因为其支持在性能/开销之间自由侧重/平衡。两者过期策略的综合使用使得Redis可以在合适的开销内取得极佳的删除效果…这些知识点会在下文详述。
 
 

实现


 惰性删除

    惰性删除策略会令过期数据在被首次访问时被删除。在惰性删除策略的控制下,Redis不会主动/实时删除过期数据,而是会等到客户端试图访问该数据时再触发删除。当客户端访问数据时,Redis主进程会判断目标数据是否已过期,是则先删除该数据,随后再执行读/写访问。

    惰性删除策略不支持开/关。惰性删除策略是Redis底层机制中必要一部分,因此其不支持开/关,即Redis没有提供相应的配置项来开/关该策略。

  • 优点:对CPU友好,因为其无需再实时监控数量庞大的数据是否过期;
  • 缺点:对内存不友好,因为过期数据会继续保留在内存中,这本质上是一种资源浪费。
     

 定期删除

    定期删除策略会周期抽取/删除过期数据。在定期删除策略的控制下,Redis“后台进程”会每隔一定时间对期限数据(存在过期时间的数据)进行抽取,并检查其中是否存在过期数据,是则将之删除。这里可能产生的疑惑是:为什么定期删除策略不直接检查全量数据呢?事实上这是出于性能方面的考量。因为一次性检查全部数据会造成CPU/内存负载的急剧增加,而这必然会对Redis的整体性能造成影响。但如果只是这样倒也并非完全无法接受,因为在Redis中全遍历这种行为其实并不少见,例如在持久化机制中Redis就会遍历整个内存以生成RDB快照文件/重写AOF日志文件,更何况定期删除策略还只需要去遍历期限数据即可,因此定期删除策略不全量检查的核心原因实际上是因为高频问题。为了应对Redis运行过程中随时可能产生的过期数据,检查需要频繁执行才能取得较好的删除效果。而这就会导致CPU/内存长期处于高负载状态,从而对Redis的整体性能造成持续性的严重影响。即而虽说Redis支持对检查频率进行配置,但现实情况是低频检查的删除效果并不合人意,因此所谓的设置也不过就是在高频范围内变化而已。

    定期删除策略不支持开/关。定期删除策略是Redis底层机制中必要一部分,因此其不支持开/关,即Redis没有提供相应的配置项来开/关该策略。但Redis却支持对定期删除策略的抽取频率进行动态设置,其在redis.conf配置文件中的配置项具体如下所示:

名称:hz
作用:设置定期删除策略每秒的抽取次数,例如10即为每秒“不高于”十次抽取,具体可设置范围为[1, 500]。
默认:10

在这里插入图片描述

    定期删除策略不一次性检查全量数据是出于性能方面的考量。Redis不支持对定期删除机制的抽取数量进行配置,不过这也不代表该值就固定不变,事实上Redis会根据所在服务器的硬件配置/定期删除策略的抽取频率/以往抽取中过期数据的综合占比等影响因素来综合决定该值的具体数量。

    定期删除策略不支持配置抽取数量。Redis不支持对定期删除机制的抽取数量进行配置,不过这也不代表该值就固定不变,事实上Redis会根据所在服务器的硬件配置/定期删除策略的抽取频率/以往抽取中过期数据的综合占比等影响因素来综合决定该值的具体数量。

  • 优点:可以动态控制抽取数据的频率,因此可以根据实际情况在性能/开销之间自由侧重/平衡;
  • 缺点:对内存不友好,因为已过期的数据会继续保留在内存中,这本质上是一种资源浪费。

http://www.kler.cn/news/367213.html

相关文章:

  • 【Python】深入理解Python的列表推导式与生成器表达式:简洁与性能的权衡
  • 【WiFi7】 支持wifi7的手机
  • 【python库】PandasGUI介绍
  • Spring Boot驱动的厨艺社交平台设计与实现
  • 【2024|滑坡数据集论文解读1】CAS滑坡数据集:用于深度学习滑坡检测的大规模多传感器数据集
  • Scala 提取器(Extractor)
  • 过采样与欠采样技术原理图解:基于二维数据的常见方法效果对比
  • git学习(1)(简单概述、代码版本控制方式(集中/分布))
  • JAVA基础:多线程 (学习笔记)
  • Tesseract OCR 安装
  • Llama 3.2-Vision 多模态大模型本地运行教程
  • 中国人寿财险青岛市分公司:科技赋能,车险服务再升级
  • QThread finished Qt::DirectionConnection可能导致start()不会返回的问题
  • ️ Vulnhuntr:利用大型语言模型(LLM)进行零样本漏洞发现的工具
  • 【微服务】Java 对接飞书多维表格使用详解
  • 数据分析人员需要掌握sql到什么程度?
  • PHP写一个二维数组排序算法函数可以调用PHP内置函数
  • 【Linux | 网络I/O模型】五种网络I/O模型详解
  • Docker下载途径
  • 【Windows】电脑端口明明没有进程占用但显示端口被占用(动态端口)
  • 正则表达式使用举例一(Python下)
  • 220V降12V1A恒流点灯WT5112
  • 论文笔记(五十一)Challenges for Monocular 6-D Object Pose Estimation in Robotics
  • mysql8数据库备份
  • 合合信息:生成式Al时代的内容安全与系统构建加速,开启智能文档的全新潜能
  • 算法设计与分析——动态规划