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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW缝缺陷图像标注库

LabVIEW缝缺陷图像标注库 开发了一个基于LabVIEW平台构建的船舶焊缝缺陷图像标注库。该库旨在通过高效和简洁的方式处理和标注船舶焊缝缺陷图像,提高缺陷识别的准确性和效率,进而保障船舶的结构安全。 项目背景 在船舶制造过程中,焊接质量…

ActiveMQ 介绍、下载、安装和控制台

ActiveMQ 介绍 Apache ActiveMQ 是一款非常成熟且功能全面的开源消息中间件,由Apache软件基金会维护。它遵循 Java Message Service (JMS) 规范,这意味着它提供了一组标准的 API,允许 Java 应用程序以一种标准化的方式发送和接收消息。 以下…

什么是距离选通型水下三维激光扫描仪?(上)

最近听说了一种水下三维激光扫描仪——距离选通型激光扫描仪,有可能应用于近岸水下目标高分辨率成像。博主之前用过ULS-500水下激光扫描仪,并写了一篇博文观察级水下机器人使用系列之五三维激光扫描仪。ULS-500对水质和环境要求较高,一般应用…

【Java数据结构】详解LinkedList与链表(三)

🔒文章目录: 1.❤️❤️前言~🥳🎉🎉🎉 2.无头双向非循环链表的实现 2.1成员属性 2.2成员方法 display——打印链表 size——获取单链表长度 addFirst——头插 addLast——尾插 addIndex——在任…

.NET AI如何从0开始?

你是否在思考如何利用AI为您公司的产品增加智能方向的业务扩展? 或者你是否有思考过怎么去利用AI减少部分工作量? 如果你有类似于上面的问题,想要学习AI,并且您是一名.NET开发工程师,或您是一名弃暗投明的Java转.NET…

MySQL查询相邻两条记录的时间间隔

MySQL查询相邻两条记录的时间间隔。最近需要统计相邻两条记录的时间间隔,筛选出时间间隔大于2min的数据记录。因为是同一张表,又需要查询出相邻的数据,所以最开始想到使用子表来做,分别用t1、t2表示,但是实践后发现查询…

AXI Quad SPI IP核AXI4接口下的三种操作模式

当选择Enable Performance Mode选项时,AXI4接口包括在内。在该模式下,IP核可以在增强模式下操作(未选择启用XIP模式)或XIP模式(选择启用XIP模式)。在性能模式下,AXI4接口用于在DTR和DRR位置的突…

《web应用技术》第11次课后作业

课后练习: 1、验证过滤器进行权限验证的原理。 2、将自己之前的项目,加上过滤器验证功能。参考以下文章: 采用JWT令牌和Filter进行登录拦截认证-CSDN博客 3、Apifox的使用 了解Apifox的工具特点和使用方法,使用Apifox辅助生成…

【计算机网络】计算机网络的组成与功能

计算机网络的组成与功能 导读一、计算机网络的组成1.1 从组成方式上1.1.1 硬件1.1.2 软件1.1.3 协议 1.2 从工作方式上1.3 从功能组成上 二、计算机网络的功能2.1 数据通信2.2 资源共享2.3 分布式处理2.4 提高可靠性2.5 负载均衡2.6 其它 结语 导读 大家好,很高兴又…

vue2+elementui,动态生成的表单校验

话不多,先上一段视频,看看是不是你们需要的效果 elementui动态生成表单校验 附上代码 <template><div class"home"><div class"home-box"><!-- <menuHtml></menuHtml> --><div class"home-div"><…

MySQL 存储过程(二)

本篇继续介绍MySQL存储过程的相关内容。 目录 一、if语句 二、case 三、循环语句 while loop repeat 一、if语句 在存储过程中&#xff0c;可以使用if语句进行条件判断&#xff0c;其语法结构如下&#xff1a; if 判断语句 then 逻辑语句..... elseif 判断语句 then 逻…

JavaScript入门宝典:核心知识全攻略(上)

文章目录 前言一、JavaScript的定义二、JavaScript的使用方式1. 行内式&#xff08;主要用于事件&#xff09;2. 内嵌式3. 外链式 三、变量和数据类型1. 定义变量2. JavaScript注释3. 数据类型4. 变量命名规范5. 匈牙利命名风格 四、函数定义和调用1. 函数定义2. 函数调用3. 定…

ctfshow-web入门-命令执行(web30-web36)

目录 1、web30 2、web31 3、web32 4、web33 5、web34 6、web35 7、web36 命令执行&#xff0c;需要严格的过滤 1、web30 代码差不多&#xff0c;就是过滤的东西变多了&#xff1a; preg_match("/flag|system|php/i", $c) 这里不让用 system &#xff0c;我们…

宝贝,带上WebAssembly,换个姿势来优化你的前端应用

❝ 在你没崛起之前&#xff0c;脸是用来丢的 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder ❝ 此篇文章所涉及到的技术有 WebAssembly Rust Web Worker( comlink) wasm-pack Photon ffmpeg.wasm 脚手架生成前端项目 ❞ 因为&…

Yolo-v5模型训练速度,与GeForce的AI算力描述

1.GeForce RTX3070 Ti官网参数&#xff1a; GeForce RTXTM 3070 Ti 和 RTX 3070 显卡采用第 2 代 NVIDIA RTX 架构 - NVIDIA Ampere 架构。该系列产品搭载专用的第 2 代 RT Core &#xff0c;第 3 代 Tensor Core、全新的 SM 多单元流处理器以及高速显存&#xff0c;助您在高性…

Hi3519DV500 学习摘录

文章目录 一、问题1、autoreconf2、open-vm-tools 安装3、NFS4、pushd: not found 一、问题 1、autoreconf automake version mismatch | AM_INIT_AUTOMAKE | 版本不匹配 autoreconf ./configure make2、open-vm-tools 安装 open-vm-tools 安装 # 用于安装和升级的命令是相…

Codeforces Round 951 (Div. 2) C、D(构造、线段树)

1979C - Earning on Bets 构造题&#xff1a;观察到k范围很小&#xff0c;首先考虑最终硬币总数可以是多少&#xff0c;我们可以先假设最终的硬币总数为所有k取值的最小公倍数&#xff0c;这样只需要满足每个结果添加1枚硬币即可赚到硬币。 // Problem: C. Earning on Bets //…

​​​​【动手学深度学习】残差网络(ResNet)的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 残差网络 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 了解残差网络&#xff08;ResNet&#xff09;的原理和架构&#xff1b;探究残…

【Vue】声明式导航-导航链接

文章目录 一、引入二、解决方案三、代码示例四、声明式导航-两个类名1&#xff09;router-link-active2&#xff09;router-link-exact-active 一、引入 但凡说到声明式导航&#xff0c;都需要想到router-link 需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要…

JSONPath使用指南(掌握JSON数据提取)

大家好&#xff0c;在处理 JSON&#xff08;JavaScript Object Notation&#xff09;数据时&#xff0c;有时需要从复杂的结构中提取特定部分。JSONPath 就是一个非常有用的工具&#xff0c;它提供了一种简洁而强大的方式来定位和提取 JSON 数据中的元素。无论是在 Web 开发中处…