Redis--内存回收机制详解

什么是内存回收机制?

众所周知Redis之所以性能高是因为数据都存在内存中,内存是很宝贵的,Redis的内存回收机制本质就是处理达到过期时间的key-value,以及当内存到达最大使用值时候触发的内存淘汰策略。

Redis数据删除的策略有哪些?

定时过期(主动淘汰):创建一个定时器,当key设置有过期时间,且达到过期时间的时候,由定时器任务立即执行删除操作。

  • 优点:节约内存,到期就删除,快速释放不需要的内存占用。
  • 缺点:cpu压力很大,无论此时cpu负载多高,均占用cpu资源,会影响redis服务器响应时间和吞吐量。
  • 总结:用处理器性能换存储空间(时间换空间)。

惰性删除(被动淘汰):数据到达过期时间,不做处理,等下次访问该数据时,如果过期就删除,不返回数据,否则正常返回。

  • 优点:节约cpu性能,发现必须删除时候才删除。
  • 缺点:内存压力大,无效数据长期占用内存空间,存在内存泄漏的风险。
  • 总结:用内存存储空间换处理器性能。

定时过期(主动淘汰):创建一个定时器,当key设置有过期时间,且达到过期时间的时候,由定时器任务立即执行删除操作。

  • 优点:节约cpu性能,发现必须删除时候才删除。
  • 缺点:不好确定删除操作执行时长和频率,执行太频繁,CPU压力大,执行间隔太久,和惰性删除一样,存在返回错误数据的风险,比如某个key已经到了过期时间,但是还没有执行定期删除,业务查无的时候会返回该数据,该数据是错误数据。
  • 总结:周期性抽查存储空间,通过调整定时扫描的时间间隔和每次扫描的限定耗时,尽量达到CPU和内存资源平衡效果,一般不推荐使用。

Redis采用的是定时删除和惰性删除的机制实现过期键的内存回收。

Redis对于设置了过期时间的key的逐出算法有哪些?

  • volatile-lru:对生存周期内最少有使用key进行置换(强调的是距离当前的时间,仅关注数据访问时间和顺序,忽略访问次数)。
  • volatile-lfu:对生存周期内最少使用次数key进行置换(强调的是时间周期内的使用次数,关注时间区间内数据访问次数)。
  • volatile-random:对生存周期中的key进行随机置换。
  • volatile-ttl:挑选将要过期的数据进行淘汰。

Redis对于全库的key的逐出算法有哪些?

  • allkeys-lru:挑选最近最少使用的数据淘汰(强调的是距离当前的时间,仅关注数据访问时间和顺序,忽略访问次数)。
  • allkeys-lfu:挑选最近使用次数最少的数据淘汰(强调的是时间周期内的使用次数,关注时间区间内数据访问次数)。
  • allkeys-random:随机选择数据淘汰。
    Redis默认的逐出策略是noeviction,当内存使用达到阈值的时候,所有申请内存的命令会报OOM。

LRU算法和LFU算法:

  • LRU算法:LRU(Least Recently Used)最近最少使用(最长时间不被使用)淘汰算法,LRU算法是淘汰最长时间没有使用key。
  • LFU算法:LFU(Least Frequently Used)最不经常使用(使用次数最少)淘汰算法,LFU是淘汰一段时间内,使用次数最少的key。

Reidis 碎片及原因?

内存分配器的分配策略决定操作系统无法按需分配,这是因为内存分配器一般是按固定大小来分配内存,而不是完全按照应用程序申请的内存空间大小给程序分配,Redis按照固定的大小将空间分配为例如8字节 16字节 32 字节 等等,Redis这么做的目的是减少分配次数,提高性能,比如客户端申请一个20字节的空间,Redis会分配一个32字节的空间,如果后面在追加10个字节的数据,Redis就无需再次分配空间了。而Redis内存碎片的产生也是因为这个策略,同样如客户端申请一个20字节的空间,Redis会分配一个32字节的空间,后续不在增加数据了,就浪费了12字节的空间,这就是内存碎片。
可以使用 info memory 查询内存的使用详细信息,mem_fragmentation_ratio 大于1.5表示内存碎片严重,需要处理了。

如何解决Redis的内存碎片问题?

  1. 重启Redis,数据重建,内存碎片问题会得到大大改善,线上一般不允许这么操作。
  2. 开启内存碎片自动清理,
 config set activedefrag yes;#表示内存碎片的字节数达到 100MB 时,开始清理;active-defrag-ignore-bytes 100mb;#表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理active-defrag-threshold-lower 10;

如有不正确的地方请各位指出纠正。

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

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

相关文章

软考重点题解析-基础知识

1.加密技术:分为对称加密技术:文件的加密和解密使用相同的密钥 和 非对称加密技术:加密和解密不同的密钥,分别是公开密钥和私有密钥。 例题:若A,B两人分别在认证机构(CA)M,N处获得证书&…

项目准备March

Nginx主要用来作为Http服务器,要实现Tomcat的负载均衡,就可以通过Nginx来实现。 正向代理代理的是客户端,反向代理代理的是服务端。SpringBoot采用约定优于配置的思想,简化Spring项目的配置开发。 前端请求其实并未直接发送到后…

php连接hdfs初步探索

一、phdfs拓展 结果:暂时舍弃 安装此拓展时,无法make成功,因为缺少hdfs.n文件。 换了其他版本的拓展包,并编译都没有找到此文件。 后搜到官网的相关资料,此hdfs.h的文件路径的地址是$HADOOP_HDFS_HOME/include/hdfs…

数据增加

目录 增加数据 实现数据增加,保存新的内容 注意 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 增加数据 由于 emp 表中的数据对日后的开发依然有用处,所以在讲解更新之前 建议将emp 表数据做一个复制。将…

linux如何查看磁盘占用情况

要查看Linux系统中磁盘的占用情况,可以使用一些命令来获取相关信息。以下是一些常用的命令: df命令: df命令用于显示文件系统的磁盘空间使用情况,包括磁盘分区的总空间、已用空间、可用空间等信息。 df -h使用 -h 参数可以以人类可…

Golang 简介与基本语法学习

Go,也被称为 Golang,是一门由 Google 设计的开源编程语言。它旨在提供高效的开发体验,同时具备并发性、内存安全和简洁性。本篇博客将介绍 Golang 的基本语法和一些示例,帮助读者快速入门这门令人着迷的语言。 简介 Go 语言的设…

一个脚本两步计算材料Raman谱(附数据处理和绘图脚本)

在以往推送中已经介绍了相当多的计算材料Raman的方法,使用的软件主要为Phonopy-Spectroscopy,相关软件还有vasp,phonopy,phono3py等。 Phonopy-Spectroscopy计算材料红外和Raman光谱 Phonopy-Spectroscopy 计算红外和拉曼光谱 也…

经典面试题从浏览器输入URL到页面加载的过程?

从输入URL到页面加载的过程涉及多个步骤,包括DNS解析、TCP连接、发送HTTP请求、服务器处理请求、浏览器解析渲染页面以及断开连接。具体如下: DNS解析:当你在浏览器中输入一个URL时,浏览器首先需要将域名转换为IP地址。这个过程称…

QT中提升为自定义控件的方法

一.介绍 提升为自定义的控件用法:先要写好自定义控件后,再添加,在频繁使用同一控件时,的确非常的高效。 同时导入别人开发的控件操作方法也类似。 二.下面以自定义的QPushButton作一个很简单的例子&#x…

MongoDB聚合运算符:$bottomN

$bottomN聚合运算符返回分组中指定顺序的最后n个元素&#xff0c;如果分组中的元素数量小于n&#xff0c;则返回分组的全部元素。从MongoDB5.2开始支持。 语法 {$bottomN:{n: <expression>,sortBy: { <field1>: <sort order>, <field2>: <sort or…

精品SSM的教学管理系统课程作业成绩

《[含文档PPT源码等]精品基于SSM的教学管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff1a;HTML5,CSS3、Jav…

esp32 C3和S3 开发板电流对比

出去好奇用合宙家的 lot power 测了两块开发板的运行电流。 esp32 S3 (嘉立创开发板 8N8 版本) 模式 电流downloa模式49 毫安空代码91 毫安light mode27 毫安deep mode25 毫安delay 40 毫安 esp32 C3 无串口芯片 &#xff08;合宙 9.9 元版本&#xff09; 模式 …

uniapp npx update-browserslist-db@lates 问题解决

在uniapp运行项目时&#xff0c;会有这种报错&#xff0c;其实这是表明browserslistlatest版本低了&#xff0c;在催你升级版本&#xff0c;browserslistlatest是用来支持解析css用的&#xff0c;当然&#xff0c;你也可以直接忽略这个报错提示&#xff0c;也可以正常运行项目。…

探索数据结构:深入了解顺序表的奥秘

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元…

【初中生讲机器学习】13. 决策树算法一万字详解!一篇带你看懂!

创建时间&#xff1a;2024-03-02 最后编辑时间&#xff1a;2024-03-02 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

取送货问题(Pickup and Delivery Problem)

取送货问题及其变体 广义取送货问题&#xff08;General Pickup and Delivery Problems&#xff0c;GPDP&#xff09;可以分为两类&#xff1a; Vehicle Routing Problems with Backhauls&#xff0c;VRPB&#xff1a;从配送中心&#xff08;depot&#xff09;取货运输货物到客…

测试/测试开发八股——找大厂测试实习基础篇

第一部分:基础概念 1. 软件测试是什么? 在规定的条件下对一个产品或者程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 软件测试工程师的任务 2. 软件测试工程师的任务 软件测试工程师主要工作是检查软件是否有bug、是否具有稳定…

5.设备驱动程序

5. 设备驱动程序 Linux 内核是一个比较庞大的系统&#xff0c;深入理解内核可以减少在系统移植中的障碍。在系统移植中设备驱动开发是一项很复杂的工作&#xff0c;由于 Linux 内核提供了一部分源代码&#xff0c;同时还提供了对某些公共部分的支持&#xff0c;例如&#xff0c…

数据结构与算法:堆

朋友们大家好啊&#xff0c;本篇文章来到堆的内容&#xff0c;堆是一种完全二叉树&#xff0c;再介绍堆之前&#xff0c;我们首先对树进行讲解 树与堆 1.树的介绍1.1节点的分类 2.树的存储结构3.二叉树的概念和结构3.1 二叉树的特点3.2 特殊的二叉树3.3二叉树的存储结构 4.堆的…

Acwing---1460. 我在哪?

我在哪&#xff1f; 1.题目2.基本思想3.代码实现 1.题目 农夫约翰出门沿着马路散步&#xff0c;但是他现在发现自己可能迷路了&#xff01; 沿路有一排共 N N N 个农场。 不幸的是农场并没有编号&#xff0c;这使得约翰难以分辨他在这条路上所处的位置。 然而&#xff0c;…