【Redis】内存回收:内存淘汰策略

news2024/12/24 14:58:44

【Redis】内存回收:内存淘汰策略

文章目录

  • 【Redis】内存回收:内存淘汰策略
    • 一、Redis内存回收-过期key处理
    • 二、Redis内存回收-内存淘汰策略

一、Redis内存回收-过期key处理

如果你发现,平时在操作 Redis 时,并没有延迟很大的情况发生,但在某个时间点突然出现一波延时,其现象表现为:变慢的时间点很有规律,例如某个整点,或者每间隔多久就会发生一波延迟。如果是出现这种情况,那么你需要排查一下,业务代码中是否存在设置大量 key 集中过期的情况。

在学习Redis缓存的时候我们说过,可以通过expire命令给Redis的key设置TTL(存活时间):

1653983366243

可以发现,当key的TTL到期以后,再次访问name返回的是nil,说明这个key已经不存在了,对应的内存也得到释放。从而起到内存回收的目的。

Redis本身是一个典型的key-value内存存储数据库,因此所有的key、value都保存在之前学习过的Dict结构中。不过在其database结构体中,有两个Dict:一个用来记录key-value;另一个用来记录key-TTL。

1653983423128

1653983606531

Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。
当内存使用达到上限时,就无法存储更多数据了。为了解决这个问题,Redis提供了一些策略实现内存回收:

Redis主要有2种过期数据回收策略:

惰性删除

  • 惰性删除指的是当我们查询key的时候才对key进行检测,如果已经达到过期时间,则删除。显然,他有⼀个缺点就是如果这些过期的key没有被访问,那么他就⼀直无法被删除,而且⼀直占用内存。

周期删除

  • 顾名思义是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。执行周期有两种:
    • Redis服务初始化函数initServer()中设置定时任务,按照server.hz的频率来执行过期key清理,模式为SLOW
    • Redis的每个事件循环前会调用beforeSleep()函数,执行过期key清理,模式为FAST
  • SLOW模式规则:
    • 执行频率受server.hz影响,默认为10,即每秒执行10次,每个执行周期100ms。
    • 执行清理耗时不超过一次执行周期的25%.默认slow模式耗时不超过25ms
    • 逐个遍历db,逐个遍历db中的bucket,抽取20个key判断是否过期
    • 如果没达到时间上限(25ms)并且过期key比例大于10%,再进行一次抽样,否则结束
  • FAST模式规则(过期key比例小于10%不执行 ):
    • 执行频率受beforeSleep()调用频率影响,但两次FAST模式间隔不低于2ms
    • 执行清理耗时不超过1ms
    • 逐个遍历db,逐个遍历db中的bucket,抽取20个key判断是否过期
      如果没达到时间上限(1ms)并且过期key比例大于10%,再进行一次抽样,否则结束

二、Redis内存回收-内存淘汰策略

内存淘汰:就是当Redis内存使用达到设置的上限时,主动挑选部分key删除以释放更多内存的流程。

这个删除旧数据的逻辑也是需要消耗时间的,而具体耗时的长短,要取决于你配置的淘汰策略:

  • allkeys-lru:不管 key 是否设置了过期,淘汰最近最少访问的 key

  • volatile-lru:只淘汰最近最少访问、并设置了过期时间的 key

  • allkeys-random:不管 key 是否设置了过期,随机淘汰 key

  • volatile-random:只随机淘汰设置了过期时间的 key

  • allkeys-ttl:不管 key 是否设置了过期,淘汰即将过期的 key

  • noeviction:不淘汰任何 key,实例内存达到 maxmeory 后,再写入新数据直接返回错误

  • allkeys-lfu:不管 key 是否设置了过期,淘汰访问频率最低的 key(4.0+版本支持)

  • volatile-lfu:只淘汰访问频率最低、并设置了过期时间 key(4.0+版本支持)

比较容易混淆的有两个:

  • LRU(Least Recently Used),最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
  • LFU(Least Frequently Used),最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。

Redis的数据都会被封装为RedisObject结构:

image-20221119022226898

最后用一副图来描述当前的这个流程吧

image-20221119023146948

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

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

相关文章

Watermelon Book(二)线性模型

文章目录线性回归对数几率回归线性类别分类多分类学习类别不平衡问题基本形式:若给定 d个属性描述的示例x(x1,x2,x3…xd),则线性模型试图学得一个 通过属性的线性组合来进行预测。f(x)W1*X1W2*X2...Wn*Xnw(T)xbw(w1;w2;w3;wn;)线性模型形式简单、易于建模…

[附源码]java毕业设计校园共享单车系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

排序算法——七种排序算法汇总,详细

文章目录排序排序的概念及应用一、直接插入排序1. 简介2.动图展示3.过程4.代码5.总结二、希尔排序1.简介2.过程3.代码4.总结三、选择排序1.简介2.代码3.总结四、堆排序1.代码2.总结五、冒泡排序1.过程2.代码3.总结六、快速排序1.简介2.过程3.两种优化快速排序的思想4.代码-递归…

【附源码】计算机毕业设计JAVA学生校内兼职管理平台

【附源码】计算机毕业设计JAVA学生校内兼职管理平台 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA…

什么是 SSH 密钥? 生成、身份验证、密钥对信息等

SSH 密钥不仅可以提高安全性,还可以实现当今企业所需的大规模连接流程、单点登录 (SSO) 以及身份和访问管理的自动化。 什么是 SSH 密钥? SSH 密钥是安全外壳 (SSH) 协议中使用的安全访问凭证。 SSH 密钥使用基于公钥基础设施 (PKI) 技术(数…

Android12窗口模糊(二)高斯模糊API源码解析

前言 在 Android 12 中,提供了一些用于实现窗口模糊处理效果(例如背景模糊处理和模糊处理后方屏幕)的公共 API。窗口模糊处理或跨窗口模糊处理用于模糊处理给定窗口后方的屏幕。 有两种窗口模糊处理方式,可用于实现不同的视觉效果…

不小心清空了回收站怎么恢复,回收站删除的东西可以恢复吗

不小心清空了回收站怎么恢复?回收站是操作系统提供的一个非常实用的功能,专门为用户保存从电脑硬盘删除的各种数据,因而很多时候我们都会用到回收站,它能够保存各种数据,我们也能够在里面恢复自己想要的数据&#xff0…

Flutter组件--AppBar相关属性

AppBar介绍 AppBar是基于Material Design设计风格的应用栏,一般使用在Scaffold内部,作为顶部导航栏。 为什么需要AppBar 1、因为导航栏里面一般由左侧功能键(返回键、菜单键)、标题、右侧功能键组成,而AppBar里面内置…

django的使用步骤详细

一、安装django pip install django 二、创建django项目 放django文件的的文件路径上输入cmd进入终端输入下面的命令 django-admin startproject 项目名称 三、app的创建 进入创建好的项目里面输入一下的命令 python manage.py startapp app名称 四、注册app 五、编写U…

计算机视觉:基于Numpy的图像处理技术(二):图像主成分分析(PCA)

计算机视觉:基于Numpy的图像处理技术(二):图像主成分分析🏳️‍🌈 文章目录计算机视觉:基于Numpy的图像处理技术(二):图像主成分分析:rainbow_flag:图像主成分…

企业数据泄漏事件频发,如何防止企业数据泄漏?

2022年即将接近尾声,这一年受疫情和国际经济形势影响,各行各业都不太好过,同样互联网领域发展不平衡、规则不健全、秩序不合理等问题日益凸显,虽然互联网的快速发展为企业数字化转型提供了支撑,但是互联网发展进程中“…

Android App开发动画特效之利用滚动器实现平滑翻页(附源码和演示 简单易懂)

需要图片集请点赞关注收藏后评论区留言~~~ 一、利用滚动器实现平滑翻页 在日常生活中,平移动画比较常见,有时也被称为位移动画,左右翻页和上下滚动其实都用到了平移动画,譬如平滑翻书的动画效果,就是位移动画的一种应…

BHQ-3 amine,1661064-89-6可在430nm至730nm范围内猝灭所有普通荧光团

英文名称:BHQ-3 amine CAS:1661064-89-6 外观:深紫色粉末 分子式:C32H36N7 分子量:518.69 储存条件:-20C,避光避湿 结构式: 凯新生物产品简介:干燥的寡核苷酸在环境…

如今传统企业如何做数字化转型?

如今传统企业如何做数字化转型? 传统企业的数字化转型,也分为大型企业和中小企业,二者的侧重是十分不同的! 大型传统企业数字化转型的侧重点是—— 如何利用新一代信息技术,整合其现有技术和资源优势,在相…

MyBatis的缓存

目录 1.一级缓存 情况一 : 不同的SqlSession对应不同的一级缓存 情况二 : 同一个SqlSession但是查询条件不同 情况三 : 同一个SqlSession两次查询期间执行了任何一次增删改操作 情况四 : 同一个SqlSession两次查询期间手动清空了缓存 2.二级缓存 2.1二级缓存的相关配置 3.MyBa…

内网渗透神器CobaltStrike之会话管理(五)

CS之间派生会话 将CS1管理的会话派生至CS2中, 简单来说就是将CS1服务器的肉鸡送给CS2服务器 准备环境 主机描述Kali(192.168.47.134)CS TeamServer1Kali2(192.168.47.144)CS TeamServer2Windows7(192.168.47.133)CS客户端,攻击机Windows7(192.168.47.141)受害机操作步骤 首先…

详解:MySQL自增ID与UUID的优缺点及选择建议,MySQL有序uuid与自定义函数实现

文章目录1.自增ID的优缺点1.1 优点1.2 缺点1.3 不适合以自增ID主键作为主键的情况2.UUID作为主键2.1 介绍2.2 优点2.3 缺点3.有序UUID作为主键3.1 介绍3.2 演示使用3.2.1 前提知识3.2.1.1 数据类型 - binary3.2.1.2 函数 - hex()3.2.1.3 函数 - unhex()3.2.2 数据库层3.2.3 JAV…

web自动化测试(java+seleium)环境安装

目录0、应用1、linux安装1.1 安装chromium1.2 安装chromedriver1.3 安装xvfb2、java maven依赖selenium依赖3、入门案例0、应用 前一段时间,需要实现一个模拟页面操作的功能,去检测程序运行是否稳定,因此就用到了web自动化检测的功能。 1、实…

Centos8安装部署JumpServer堡垒机

1:安装支持在线安装和离线安装,我们选择在线安装一键部署。安装需要的环境要求。 OS/ArchArchitectureLinux KernelSoft Requirementlinux/amd64x86_64> 4.0wget curl tar gettext iptables pythonlinux/arm64aarch64> 4.0wget curl tar gettext …

highcharts 堆积图

参考 多坐标轴混合图 | JShare 使用 js资源 https://cdn.highcharts.com.cn/10.2.1/highcharts.js https://cdn.highcharts.com.cn/10.2.1/modules/exporting.js https://img.hcharts.cn/highcharts-plugins/highcharts-zh_CN.js 效果 js 引用 <script src"https…