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

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.lryc.cn/news/309635.html

相关文章:

  • win安装卸载python3.13
  • APIFox-自动获取登录状态操作
  • 【NDK系列】Android tombstone文件分析
  • CentOS7 Hive2.3.8安装
  • 代码随想录算法训练营第四十四天 完全背包 、零钱兑换 II 、组合总和 Ⅳ
  • 【经验】vscode 鼠标拖曳不能选中整行文字,只能选中纵向矩形范围
  • Redis--事务机制的详解及应用
  • 路由器端口映射如何配置?
  • 力扣34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
  • 【每日一题】3.2 求逆序对
  • NTP时间源服务器(NTP网络时钟)助力智慧医院数字化
  • Benchmark学习笔记
  • Linux中的动静态库
  • C/C++基础语法
  • Home Assistant:基于Python的智能家居开源系统详解
  • 使用vscode进行简单的多文件编译
  • Python实现PPT演示文稿中视频的添加、替换及提取
  • Mysql学习之MVCC解决读写问题
  • Linux下如何生成coredump文件
  • eltable 合计行添加tooltip
  • Secure Boot(安全启动)
  • 大厂面试经验:如何对加密后的数据进行模糊查询操作
  • 修改docker默认存储位置【高版本的docker】
  • CleanMyMac X2024免费Mac电脑清理和优化工具
  • 吴恩达机器学习全课程笔记第四篇
  • 大数据分析师常用函数
  • MySQL 主从读写分离入门——基本原理以及ProxySQL的简单使用
  • ROS2从入门到精通:理论与实战
  • docker 安装minio 一脚shell脚本
  • 【数据库】mybatis使用总结