Redis 删除策略和内存淘汰策略

news2024/11/27 1:48:56

文章目录

  • 一、过期数据
  • 二、数据删除策略
    • 2-1 定时删除
    • 2-2 惰性删除
    • 2-3 定期删除
  • 三、内存淘汰策略
    • 3-1 新数据进入检测
    • 3-2 影响数据逐出的相关配置
    • 3-3 八种数据逐出策略


提示:以下是本篇文章正文内容,Redis系列学习将会持续更新

一、过期数据

Redis中的数据特征: Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态。

  • XX :具有时效性的数据
  • -1 :永久有效的数据
  • -2 :已经过期的数据 或 被删除的数据 或 未定义的数据

过期的数据真的删除了吗?
在这里插入图片描述
在这里插入图片描述

回到目录…

二、数据删除策略

时效性数据的存储结构:
在这里插入图片描述
数据删除策略的目标:
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露。

2-1 定时删除

  • 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作。
  • 优点:节约内存,到时就删除,快速释放掉不必要的内存占用。
  • 缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量。
  • 总结:用处理器性能换取存储空间(拿时间换空间)。

2-2 惰性删除

  • 数据到达过期时间,不做处理。等下次访问该数据时,先expireIfNeeded(),后get key
    • 如果未过期,返回数据;
    • 发现已过期,删除,返回不存在。
  • 优点:节约CPU性能,发现必须删除的时候才删除。
  • 缺点:内存压力很大,出现长期占用内存的数据。
  • 总结:用存储空间换取处理器性能(拿时间换空间)。

2-3 定期删除

前两种方案都走极端,有没有折中方案?

  • Redis启动服务器初始化时,读取配置server.hz的值,默认为10

  • 每秒钟执行 server.hz 次
    在这里插入图片描述
    serverCron() :每秒钟执行server.hz次淘汰策略。
    databasesCron() :轮流循环所有db库。
    activeExpireCycle() :每个db库中的具体删除策略实现。

  • activeExpireCycle() 对每个 expires[*] 逐一进行检测,每次执行 250ms/server.hz

    • 对某个 expires[*] 检测时,随机挑选 W个key 检测
      • 如果key超时,删除key
      • 如果一轮中删除的key的数量 > W*25%,循环该过程
      • 如果一轮中删除的key的数量 ≤ W25%,检查下一个expires[] ,0-15循环
      • W = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 属性值
    • 参数 current_db 用于记录 activeExpireCycle() 进入哪个 expires[*] 执行
    • 如果 activeExpireCycle() 执行时间到期,下次从 current_db 继续向下执行

在这里插入图片描述

定期删除:

  • 周期性轮询 redis 库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。
  • 特点1:CPU性能占用设置有峰值,检测频度可自定义设置。
  • 特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理。
  • 总结:周期性抽查存储空间(随机抽查,重点抽查)。

删除策略比对:

删除策略内存CPU特点
定时删除节约内存,无占用不分时段占用CPU资源,频度高拿时间换空间
惰性删除内存占用严重延时执行,CPU利用率高拿空间换时间
定期删除内存定期随机清理每秒花费固定的CPU资源维护内存随机抽查,重点抽查

回到目录…

三、内存淘汰策略

3-1 新数据进入检测

当新数据进入redis时,如果内存不足怎么办?

  • Redis 使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis 要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法
  • 注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
    在这里插入图片描述

3-2 影响数据逐出的相关配置

● 最大可使用内存

maxmemory
占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定,通常设置在50%以上。

● 每次选取待删除数据的个数

maxmemory-samples
选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测除数据。

● 删除策略

maxmemory-policy
达到最大内存后的,对被挑选出来的数据进行删除的策略。

● 数据逐出策略配置依据
使用INFO命令输出监控信息,查询缓存 hit 和 miss 的次数,根据业务需求调优 Redis 配置。

3-3 八种数据逐出策略

  • 检测易失数据(可能会过期的数据集 server.db[i].expires )
    volatile-lru:挑选最近时间内最少使用 (距离上次使用最久) 的数据淘汰。
    volatile-lfu:挑选最近时间内使用次数最少的数据淘汰。
    volatile-ttl:挑选将要过期的数据淘汰。
    volatile-random:任意选择数据淘汰。
  • 检测全库数据(所有数据集server.db[i].dict )
    allkeys-lru:挑选最近时间内最少使用 (距离上次使用最久) 的数据淘汰。
    allkeys-lfu:挑选最近时间内使用次数最少的数据淘汰。
    allkeys-random:任意选择数据淘汰。
  • 放弃数据驱逐
    no-enviction:禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)。

回到目录…


总结:
提示:这里对文章进行总结:
本文是对Redis的学习,认识了过期数据和3种删除策略,以及内存不足时的内存淘汰策略。之后的学习内容将持续更新!!!

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

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

相关文章

jvm知识点

jvm面试总结 类加载机制? 如何把类加载到jvm中 ? 装载–>链接–>初始化–>使用–>卸载 装载: ClassFile–>字节流–>类加载器将字节流所代表的静态结构转化为方法区的运行时数据结构在我们的堆中生成一个代表这个类的java.lang.Class对象 链接: 验证–…

MATLAB/Simulink 通信原理及仿真学习(三)

文章目录MATLAB/Simulink 通信原理及仿真学习(三)3. 通信信号与系统分析3.1 离散信号和系统3.1.1 离散信号3.1.2 离散时间信号3.1.3 信号的能量和功率3.2 傅里叶(Fourier)分析3.2.1 连续时间信号的Fourier变换3.2.2 离散时间信号的…

IDEA-使用插件远程连接Redis

前言 IDEA连接Redis可视化,可以在IDEA中,删除存储的缓存等操作 使用 点击工具栏的File->Settings->Plugins,然后进行搜索Redis,我这里下载过了 然后点击Install进行下载,下载好后,重启IDE 然后会提示&#xf…

什么是Struts2?有哪些优势

Java中Strutsl是最早的基于MVC模式的轻量级Web框架,它能够合理地划分代码结构,并包含验证框架、国际化框架等多种实用工具框架。但是随着技术的进步,Struts1的局限性也越来越多地暴露出来。为了符合更加灵活、高效的开发需求,Stru…

求职者:“我有五年测试经验”面试官: “不,你只是把一年的工作经验用了五年”

最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实,没有持续学习的习惯,但对于…

非对称密钥PKCS#1和PKCS#8格式互相转换(Java)

目录一、序言二、代码示例1、Maven依赖2、工具类封装三、测试用例1、密钥文件2、公私钥PKCS1和PKCS8格式互相转换一、序言 之前在 《前后端RSA互相加解密、加签验签、密钥对生成》 中提到过PKCS#1格式和PKCS#8格式密钥的区别以及如何生成密钥。实际有些场景中有可能也会涉及到…

过来人的忠告:如何入门网络安全?

前沿概述 随着2017年《网络安全法》颁布和2019年《等保2.0》正式实施,以及越来越多大学开设网络空间安全、电子对抗等专业,网络安全也被大家熟知,很多人想入行网络安全。作为信息安全毕业,也在安全领域摸爬滚打十年的我&#xff…

和平精英五曜赐福返场,老款玛莎返场来了

和平精英五曜赐福返场,老款玛莎返场来了!新款如何选择! 关于返场的新消息,都说云南百收SEO解说消息不准,之前看过文章的应该会知道,全网只有云南百收SEO解说发了。玛莎返场,快喊你的阿姨来看&a…

wordpress 网站备份

一个网站从建站完成之日,备份的问题就要提上日程。不论是后期的更换服务器,更换域名,未知故障导致网站崩溃,数据丢失,只要我们有完整的备份,就能将损失降到最低。wordpress网站的备份方法多种多样&#xff…

将闲置的Ipad作为Windows的副屏(Twomon SE)

目录一、前言二、方法第一步 安装软件第二步 使用步骤三、注意一、前言 在看网课的时候,总有种不得劲的感觉,来来回回的切换就很糟心~~无意间看见闲置的板砖(Ipad),计上心来-- _ – 期间也尝试过免费的软件&#xff…

【面试题】TCP如何保证传输可靠性?TCP流量控制实现、拥塞控制、ARQ协议、停止等待ARQ、连续ARQ

文章目录1. TCP 如何保证传输的可靠性?2.TCP 如何实现流量控制?3.TCP 的拥塞控制是怎么实现的?3.ARQ 协议了解吗?4.停止等待 ARQ 协议5.连续 ARQ 协议1. TCP 如何保证传输的可靠性? 基于数据块传输 :应用数据被分割成…

【C++】C++入门(上)

前言: C是在C语言的基础上不断添加东西形成的一门语言,在C语言的基础上引入了面向对象的思想。因此C既是面向对象的语言,也是面向过程的语言。因为C是以C语言为基础的,所以基本上C兼容所有的C语言。目前最常用的版本是C98和C11这两…

Java通过SNMP4J管理设备

一、Windows开启SNMP服务这里以Windows11为例:1、安装SNMP服务(1)通过winx快捷键打开电脑“设置”,然后在“应用”中选择”可选功能“。(2)点击”可选功能“的”查看功能“(3)找到并勾选“WMI SNMP 供应商",再点击”下一步“。这里借用下…

【MySQL】sql中explain解释和应用

这里写目录标题学习原因MySQL中explain的使用和用法解释explain的使用explain 运行结果的意义文字展示表格展示参考资料:结束语学习原因 在对sql的优化过程中使用了explain对指定的sql进行查看它的运行效果,以便找出sql的性能特点并进行优化 MySQL中ex…

20230222解决在WIN7下的UltraEdit9不能新建文件但是可以打开TXT文件

20230222解决在WIN7下的UltraEdit9不能新建文件但是可以打开TXT文件 2023/2/22 17:34 UltraEdit-32 Cannot edit file Cant create tempory file 确定 解决方式: C:\Users\Administrator\AppData\Local\Temp目录下的内容清除即可。 Temp文件夹竟然写满了&#xff…

Python进阶知识

目录 一、装饰器和闭包 1、装饰器 decorator 2、闭包 closure 二、迭代器与生成器 二、面向对象编程 1、概念 2、类和对象 2.1 概念 2.2 定义类和创建对象 2.3 __init__(self): 2.4 self的理解 3、魔术方法 3.1__str__() 3.2 __new__() 4、析构方法 5、类的继…

在CentOS-7.9配置vsftpd服务

文章目录一 vsftpd简介二 环境准备三 服务部署3.1 安装软件3.2 编写配置文件3.3 用户授权3.4 启动服务3.5 文件传输测试3.5.1 Windows到Linux3.5.2 filezilla3.5.3 从Linux到Linux一 vsftpd简介 FTP是 File Transfer Protocol 文件传输协议的简称。 VSFTP是 Very Security FTP…

【QT】史上最全最详细的QSS样式表用法及用例说明

目录1. Qt样式表语法2. 选择器2.1 可设置样式的部件2.2 选择器类型2.3 子控件2.4 伪状态3. 属性列表4. 冲突解决5. qss示例1. Qt样式表语法 Qt样式表支持各种属性、伪状态和子控件,可以自定义小部件的外观。 selector { attribute: value }selector:选择器&#xf…

Android Gradle 学习笔记(四)构建块基本单元掌握

本篇主要学习 Gradle 构建脚本的三个基本组建成: project 项目task 任务property 属性 我将会重点介绍 Task,因为它是所有基础中的基础, project 的知识更多和实战有关(例如模块化),而 property 本身不过…

新手怎么快速学会并上手SQL语言?收藏版

SQL可以说是程序员、数据库管理员DBA、数据分析师等需要做数据处理和分析岗位最常用的程序语言了。 尤其是一些岗位,工作中并非以数据库为核心,只是偶尔用些数据不需要深度学习,不得不自己去做一些取数的事情,只要学会通过SQL取数…