Redis学习(十二)Redis的三种删除策略

目录

    • 一、背景
    • 二、Redis 的三种删除策略
      • 2.1 定时删除(用CPU换内存空间)
      • 2.2 定期删除
      • 2.3 惰性删除(用内存换CPU性能)
    • 三、总结

一、背景

我们都知道 Redis 是一种内存数据,所有的数据均存储在内存中,可以通过 ttl 指令查看数据的状态:

  • xx:表示具有时效性的数据。
  • -1:表示永久性的数据。
  • -2:表示过期的数据,或已经删除的数据,或未定义的数据。

但是 过期的数据真的被删除了吗?

  • 在 Redis 的执行过程中,会让 CPU 处理很多的指令,CPU 可能会一下子处理不过来,这样就需要区分优先级了。
  • 很明显 Redis 的 key 过期删除操作没有那么重要,所以就先不删除,继续保存在内存中。
  • 那什么时候删除呢?这就是 Redis 的删除策略做的事了。

删除策略的目标: 就是 在内存和 CPU 占用之间找到一个平衡,在 CPU 空闲的时候再去删除过期的数据,防止出现 CPU 过载导致服务器宕机、内存泄漏等问题


二、Redis 的三种删除策略

Redis 有以下三种删除策略:定时删除、

2.1 定时删除(用CPU换内存空间)

实现方式: 创建一个定时器,每间隔一段时间,定时器会 对全量 key 的扫描,并删除过期的 key。

  • 优点: 节约内存,可以定期立即释放掉所有不必要的内存空间。
  • 缺点: CPU 的压力会很大,不会考虑删除的时候 CPU 是否空闲,会影响 Redis 服务器的响应时间和吞吐量。
  • 应用场景: 适用于对数据过期时间要求不高,数据量较小的场景。

2.2 定期删除

实现方式:redis.cactiveExpireCycle() 函数实现,周期性轮询 Redis 库中的时效性数据,采用随机抽取策略,利用过期数据占比的方式控制删除的频率。

  • Redis 启动服务器初始化时,读取配置 server.hz 的值,默认为10。
  • 每秒钟执行 server.hz 次 serverCron() -> databaseCron() -> activeExpireCycle()
  • activeExpireCycle() 对每个 expires[*] 逐一进行检测,每次执行 250ms/server.hz。
  • 对某个 expires[*] 检测时,随机挑选 W 个 key 检测:
    • 如果key超时,删除 key;
    • 如果一轮中删除的 key 的数量 > W * 25%,循环该过程;
    • 如果一轮中删除的 key 的数量 ≤ W * 25%,检查下一个 expires[*],0~15循环;
    • W 取值 = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 属性值。
  • 参数 current_db 用于记录 activeExpireCycle() 进入了哪个 expires[*] 执行。
  • 如果 activeExpireCycle() 执行时间到期,下次从 current_db 继续向下执行。
  • 优点:
    1. CPU 性能占用设置有峰值,检测频率可自定义设置,相对于定时删除,可以更灵活地控制 CPU占用,适用于数据量较大的情况。
    2. 内存压力不是很大,长期占用内存的冷数据会被持续清理。
  • 缺点: 可能会导致短时间内部分内存无法及时释放,对系统性能有一定影响。
  • 应用场景: 适用于数据量较大、对内存占用没有特别要求的场景。

补充: 定期删除函数的运行频率,在 Redis 2.6 版本中,规定每秒运行 10次,大概 100ms 运行一次。在 Redis 2.8 版本后,可以通过修改配置文件 redis.confhz 选项来调整这个次数。

在这里插入图片描述

2.3 惰性删除(用内存换CPU性能)

实现方式: 数据到达过期时间,不做处理。等下次访问该数据时,发现未过期,则返回值,发现已经过期,删除 expires 空间和 key 值,并返回不存在。

  • 优点: 节约 CPU 性能,当数据必须删除的时候才删除。
  • 缺点: 内存压力较大,会出现过期数据长期占用内存的情况。
  • 应用场景: 适用于对数据过期时间要求不严格、对内存占用要求宽松的场景。

三、总结

Redis 采用的是 定期删除 + 惰性删除 的策略。

注意:删除策略只是一种策略,在 Redis 并 不能通过修改配置文件的方式进行切换,Redis 中删除策略的具体实现是通过 内存淘汰机制 实现。

整理完毕,完结撒花~🌻





参考地址:

1.Redis删除策略,https://blog.csdn.net/xiaobai_mantou/article/details/107191137
2.Redis中常见的三种删除策略,https://blog.csdn.net/qq_44577699/article/details/134965409
3.Redis删除策略详解和Redis核心配置(简单详细,谁看谁知道),https://www.cnblogs.com/lxl01/p/14995601.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 代码打印meminfo

旨在替代adb shell dumpsys meminfo packageName,在log打印meminfo,以便分析内存情况 ActivityManager.MemoryInfo memoryInfo new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); long totalMemory Runtime.getRuntime(…

大数据环境搭建@Hive编译

Hive3.1.3编译 1.编译原因1.1Guava依赖冲突1.2开启MetaStore后运行有StatsTask报错1.3Spark版本过低 2.环境部署2.1jdk安装2.2maven部署2.3安装图形化桌面2.4安装Git2.5安装IDEA 3.拉取Hive源码4.Hive源码编译4.1环境测试1.测试方法——编译2.问题及解决方案💥问题1…

【设计模式】结构型-装饰器模式

在代码的海洋深处迷离,藏匿着一片神奇之地。那里有细腻的线条交错,是装饰器的奇妙艺术。 文章目录 一、登录的困境二、装饰器模式三、装饰器模式的核心组成部分四、运用装饰器模式五、装饰器模式的应用场景六、小结推荐阅读 一、登录的困境 假设我们有…

YOLOv5改进总目录 | backbone、Neck、head、损失函数,注意力机制上百种改进技巧

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏地址: YOLOv5改进入门——持续更新各种有效涨点方法 点击即可跳转 报错 解决Yolov5的RuntimeError: result type Float can…

qq号码采集软件

寅甲QQ号码采集软件, 一款采集QQ号、QQ邮件地址,采集QQ群成员、QQ好友的软件。可以按关键词采集,如可以按地区、年龄、血型、生日、职业等采集。采集速度非常快且操作很简单。

C# WPF入门学习主线篇(九)—— ComboBox常见属性和事件

欢迎来到C# WPF入门学习系列的第九篇。在前面的文章中,我们已经学习了 Button、TextBox、Label 和 ListBox 控件。今天,我们将探讨 WPF 中的另一个重要控件——ComboBox。本文将详细介绍 ComboBox 的常见属性和事件,并通过示例代码展示其在实…

逻辑这回事(三)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时,Tsu表示数据前边沿距离时钟上升沿的时间,MicTsu表示时钟clk能够稳定采样数据D的所要求时间,Th表示数据后边沿距离时钟上升沿的时间,MicTh表示时钟clk采样…

Spring Boot集成pmd插件快速入门Demo

1.什么是pmd插件? PMD 插件允许您在项目的源代码上自动运行PMD代码分析工具,并生成带有其结果的站点报告。它还支持与 PMD 一起分发的单独的复制/粘贴检测器工具(或 CPD)。 此版本的 Maven PMD 插件使用 PMD 6.42.0 并且需要 Jav…

从大到小吗?-分支c++

题目描述 给出 4 个整数,a , b , c , d 。 判断这四个数字是否满足从大到小。 输入 输入 4 个整数,a , b , c , d 。 输出 输出 Yes 或者 No 。 样例输入 4 3 2 1 样例输出 Yes 提示 分析: 这道题十分的简单,只需判断…

23 二叉搜索树

本节目标 1.内容安排说明 2.二叉搜索树实现 3.应用分析 4.进阶题 1. 内容安排说明 二叉树在c数据结构已经说过了,本节内容是因为: map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构二叉搜索树的特性了解,有助于…

Linux:动态库和静态库的编译与使用

目录 1.前言 2.静态链接库 3.静态链接库生成步骤 4.静态链接库的使用 5.动态链接库 6.动态链接库生成步骤 7.动态链接库的使用 8.动态链接库无法加载 9.解决动态链接库无法加载问题 前言 在《MinGW:从入门到链接库》博客中简单介绍了如何编译动态链接库和静态链接库…

YOLOv5车流量监测系统研究

一. YOLOv5算法详解 YOLOv5网络架构 上图展示了YOLOv5目标检测算法的整体框图。对于一个目标检测算法而言,我们通常可以将其划分为4个通用的模块,具体包括:输入端、基准网络、Neck网络与Head输出端,对应于上图中的4个红色模块。Y…

Attendance Machine (KPI)

Attendance Machine (KPI) QQ机考勤机数据KPI

SecureCRT[po破] for Mac SSH终端操作工具[解] 安装教程

文章目录 效果一、准备工作二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、 应用程序显示软件图标,表示安装成功 三、输入对应参数1、解决“软件已损坏,无法打开,要移到废纸篓”问题解决步骤…

【Python】pip 使用方法详解

目录 0 简介 1 pip 基本使用 1.1 安装 pip 1.2 卸载 pip 1.3 更新 pip 1.4 查看帮助 2 安装包 2.1 安装单个包 2.2 批量安装多个包 3 卸载包 4 使用镜像源 4.1 国内常用镜像源 4.1 单次安装设置镜像源 4.2 设置默认镜像源 0 简介 pip 是 python 官方的包管理工具…

一起学大模型 - 一起动笔练习prompt的用法

文章目录 前言一、代码演示二、代码解析1. 导入所需的库和模块:2. 设置日志记录和初始化模型:3. 定义一个函数用于清理GPU内存:4. 定义一个继承自LLM基类的QianWenChatLLM类,并实现对话生成的逻辑:5. 示例代码的主体部…

C++ | Leetcode C++题解之第137题只出现一次的数字II

题目&#xff1a; 题解&#xff1a; class Solution { public:int singleNumber(vector<int>& nums) {int a 0, b 0;for (int num: nums) {b ~a & (b ^ num);a ~b & (a ^ num);}return b;} };

安卓约束性布局学习

据说这个布局是为了解决各种布局过度前套导致代码复杂的问题的。 我想按照自己想实现的各种效果来逐步学习&#xff0c;那么直接拿微信主页来练手&#xff0c;用约束性布局实现微信首页吧。 先上图 先实现顶部搜索框加号按钮 先实现 在布局中添加一个组件&#xff0c;然后摆放…

2024 年最全的 21 款数据恢复工具软件汇总

使用其中任何一款免费数据恢复工具&#xff0c;您都可以找回那些您认为已经永远消失的文件。我根据这些程序对我而言的易用性和它们提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者都安装…

软件测试--Linux快速入门

文章目录 软件测试-需要掌握的Linux指令Linux命令操作技巧Linx命令的基本组成常用命令 软件测试-需要掌握的Linux指令 Linux命令操作技巧 使用Tab键自动补全上下键进行翻找之前输入的命令命令执行后无法停止使用CtrC,结束屏幕输出 Linx命令的基本组成 命令 [-选项] [参数] …