百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis | 内存回收策略(redis内存管理机制)

mhr18 2024-10-24 11:10 27 浏览 0 评论

Redis 可以认为是一个内存数据库,我们可以向 Redis 插入多种格式的数据,这些数据同时也会占用相应的内存空间,如果只增不减,内存尽早会用完,新的数据将无法正常写入。

如何回收内存空间?

如果数据还在使用中,肯定是不能随便回收的,这样会造成数据不稳定。

DEL

通过 del 命令删除数据,硬删除,没什么好说的,乖乖释放内存就好了。

回收过期数据

Redis 可以通过 expire 命令为键设置过期时间,超过了设定的过期时间,则数据自动失效,但失效的数据并没有被删除,也就是说数据虽然失效,客户端无法获取到,但内存空间并没有马上释放。

Redis 提供了主动和被动两种方式来回收这部分内存。

  • 被动,当客户端尝试读取一个已经过期的 key 时,会触发 Redis 删除该 key
  • 主动,但有的过期 key 可能永远都不会被访问,所以,仅仅靠被动方式是不够的,Redis 会周期轮询判定 key 是否过期,过期的 key 会被删除。

但如果每次都轮询所有 key 的话,一个一个去判定是否过期,那么这也将是一个很耗时的操作,可能影响到 Redis 本身的响应速度,所以 Redis 采用了一种平凡的概率算法:

Redis 会每秒执行 10 次测试,随机 20key 进行过期检测,删除所有已经过期的 key,如果有多于 25%key 过期,重复执行,直到过期的 key 比例低于 25%

通过这个算法,Redis 每次清理顶多清理掉 25% 的过期数据,但可以更好地保障 Redis 的高性能,其实是一种以空间换时间的操作。

Slave 如何处理过期数据

上面讲的都是 Master 如何处理过期数据,Slave 在处理过期数据时跟 Master 不太一样。

当一个 key 过期,Master 会给 Slave 合成一个 DEL 同步命令,Slave 不会独立过期 key,而是等待 MasterDEL 命令。

内存已满

当向 Redis 写入数据时,检测到内存已满,无法正常写入,此时 Redis 也有可能会进行一次内存回收,这处决于 Redis 设置的 maxmemory-policy 策略。

maxmemory-policy 有以下六种策略可选

  • noeviction:返回错误
  • allkeys-lru:尝试回收最少使用的数据(LRU)
  • volatile-lru:尝试回收最少使用的数据(LRU),但只限于设置了过期时间的数据
  • allkeys-random:尝试随机回收部分数据
  • volatile-random:尝试随机回收部分数据,但只限于设置了过期时间的数据
  • volatile-ttl:尝试回收设置了过期时间的数据,优先回收存活时间(TTL)较短的数据。

只要不是设置的 noeviction,都会触发一次内存回收。

具体可以参考 Redis知识点 - 当内存不足时,redis如何响应?

最后关注一下,共同学习


相关推荐

【预警通报】关于WebLogic存在远程代码执行高危漏洞的预警通报

近日,Oracle官方发布了2021年1月关键补丁更新公告CPU(CriticalPatchUpdate),共修复了包括CVE-2021-2109(WeblogicServer远程代码执行漏洞)...

医院信息系统突发应急演练记录(医院信息化应急演练)

信息系统突发事件应急预案演练记录演练内容信息系统突发事件应急预案演练参与人员信息科参与科室:全院各部门日期xxxx-xx-xx时间20:00至24:00地点信息科记录:xxx1、...

一文掌握怎么利用Shell+Python实现完美版的多数据源备份程序

简介:在当今数字化时代,无论是企业还是个人,数据的安全性和业务的连续性都是至关重要的。数据一旦丢失,可能会造成无法估量的损失。因此,如何有效地对分布在不同位置的数据进行备份,尤其是异地备份,成为了一个...

docker搭建系统环境(docker搭建centos)

Docker安装(CentOS7)1.卸载旧版Docker#检查已安装版本yumlistinstalled|grepdocker#卸载旧版本yumremove-ydocker.x...

基础篇:数据库 SQL 入门教程(sql数据库入门书籍推荐)

SQL介绍什么是SQLSQL指结构化查询语言,是用于访问和处理数据库的标准的计算机语言。它使我们有能力访问数据库,可与多种数据库程序协同工作,如MSAccess、DB2、Informix、M...

Java21杀手级新特性!3行代码性能翻倍

导语某券商系统用这招,交易延迟从12ms降到0.8ms!本文揭秘Oracle官方未公开的Record模式匹配+虚拟线程深度优化+向量API神操作,代码量直降70%!一、Record模式匹配(代码量↓8...

一文读懂JDK21的虚拟线程(java虚拟线程)

概述JDK21已于2023年9月19日发布,作为Oracle标准Java实现的一个LTS版本发布,发布了15想新特性,其中虚拟线程呼声较高。虚拟线程是JDK21中引入的一项重要特性,它是一种轻量级的...

效率!MacOS下超级好用的Linux虚拟工具:Lima

对于MacOS用户来说,搭建Linux虚拟环境一直是件让人头疼的事。无论是VirtualBox还是商业的VMware,都显得过于笨重且配置复杂。今天,我们要介绍一个轻巧方便的纯命令行Linux虚拟工具...

所谓SaaS(所谓三维目标一般都应包括)

2010年前后,一个科技媒体的主编写一些关于云计算的概念性问题,就可以作为头版头条了。那时候的云计算,更多的还停留在一些概念性的问题上。而基于云计算而生的SaaS更是“养在深闺人未识”,一度成为被IT...

ORA-00600 「25027」 「x」报错(报错0xc0000001)

问题现象:在用到LOB大对象的业务中,进行数据的插入,失败了,在报警文件中报错:ORA-00600:内部错误代码,参数:[25027],[10],[0],[],[],[],[],[...

安卓7源码编译(安卓源码编译环境lunch失败,uname命令找不到)

前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...

编译安卓源码(编译安卓源码 电脑配置)

前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...

360 Vulcan Team首战告捷 以17.5万美金强势领跑2019“天府杯“

2019年11月16日,由360集团、百度、腾讯、阿里巴巴、清华大学与中科院等多家企业和研究机构在成都联合主办了2019“天府杯”国际网络安全大赛暨2019天府国际网络安全高峰论坛。而开幕当日最激荡人...

Syslog 日志分析与异常检测技巧(syslog发送日志配置)

系统日志包含有助于分析网络设备整体运行状况的重要信息。然而,理解并从中提取有效数据往往颇具挑战。本文将详解从基础命令行工具到专业日志管理软件的全流程分析技巧,助你高效挖掘Syslog日志价值。Gr...

从Oracle演进看数据库技术的发展(从oracle演进看数据库技术的发展的过程)

数据库技术发展本质上是应用需求驱动与基础架构演进的双向奔赴,如何分析其技术发展的脉络和方向?考虑到oracle数据库仍然是这个领域的王者,以其为例,管中窥豹,对其从Oracle8i到23ai版本的核...

取消回复欢迎 发表评论: