Redis过期删除策略和内存淘汰策略的区别

过期删除策略

有关过期时间的设置和查询

image.png
查看某个 key 剩余的存活时间,可以使用 TTL 命令(单位是秒)。
取消 key 的过期时间,则可以使用 PERSIST 命令。

# 取消 key1 的过期时间
> persist key1
(integer) 1# 使用完 persist 命令之后,
# 查下 key1 的存活时间结果是 -1,表明 key1 永不过期 
> ttl key1 
(integer) -1

过期字典

过期字典就是一个哈希表,和保存键值对的字典(包含了两个哈希表,一个是真正保存键值对的,一个是在rehash时使用的)不同,它保存的是键和键对应的过期时间

typedef struct redisDb {dict *dict;    /* 数据库键空间,存放着所有的键值对 */dict *expires; /* 键的过期时间 */....
} redisDb;

字典的结构

保存键值对的字典
保存键和过期时间的字典
通过查询这个过期字典,就可以知道某个key是否有过期时间。当我们查询一个key时,Redis会先去过期字典中查询,如果不存在,则直接在另一个字典(保存键值对的字段)中查询出对应的value返回;如果这个key存在于过期字典中,就查询对应的过期时间和当前系统时间进行对比,如果小于当前系统时间,就说明过期了

过期删除策略有哪些?

Redis的过期删除策略有三种,分别是“定时删除”、“惰性删除”、“定期删除”

定时删除

定时删除是设置key的过期时间时,为当前的key设置一个定时事件,当这个key过期时,就会触发定时处理器处理这个定时事件,对key进行删除

  • 优点:对内存友好的。可以尽快地删除一些键值对,释放内存空间
  • 缺点:对CPU不友好的。在过期的key很多的时候,删除大量的key会占有相当一部分的CPU时间,如果这时内存不紧张但是CPU比较紧张的话,就会对客户端的响应和吞吐量造成一定的影响
惰性删除

设置key的过期时间可能到了,但是不会主动删除,而是在每次数据库访问key的时候,顺便看看这个key是不是过期了,发现过期了再删除

  • 优点:对CPU友好的。因为在访问到这个key的时候发现过期再删除,只会占有一小部分CPU资源。
  • 缺点:对内存不友好。因为有些key可能已经过期了,但是一直没有被访问而一直驻留在内存当中,浪费了内存空间。

功能伪代码:

int expireIfNeeded(redisDb *db, robj *key) {// 判断 key 是否过期if (!keyIsExpired(db,key)) return 0;..../* 删除过期键 */....// 如果 server.lazyfree_lazy_expire 为 1 表示异步删除,反之同步删除;return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) :dbSyncDelete(db,key);
}
定期删除

每隔一段时间随机地从数据库中取出一部分key进行检查是否过期,过期了再删除。是一种介于定时删除和惰性删除之间的策略

  • 优点:一方面限制了执行删除操作的时长和频率,减少删除操作对CPU的影响;同时也能够随机地删除一部分过期的键值对,减少内存的浪费
  • 缺点:
  1. 在内存清理方面没有定时删除策略效果好,在CPU资源的使用上也没有惰性删除策略来的好
  2. 难以控制删除操作执行的时长和频率。如果执行太频繁,就会变得和定时删除策略一样,对CPU不友好;如果执行频率过低,就会变得和惰性删除一样,有些内存来不及释放,对内存不友好

功能伪代码:
循环中每次从过期字典中抽取20个key检查是否过期,如果过期则删除,同时记录本轮20个key中过期的key的数量expired,循环检查完20个key后判断expired是否操作检查的key的25%,超过则进入下一检查。为了避免不定地检查,会设置一个timelimit_exit限制检查是否检查时间超时

do {//已过期的数量expired = 0//随机抽取的数量num = 20;while (num--) {//1. 从过期字典中随机抽取 1 个 key//2. 判断该 key 是否过期,如果已过期则进行删除,同时对 expired++}// 超过时间限制则退出if (timelimit_exit) return;/* 如果本轮检查的已过期 key 的数量,超过 25%,则继续随机抽查,否则退出本轮检查 */
} while (expired > 20/4);
Redis采用的过期删除策略

Redis采用的是定期删除和惰性删除两种策略配合使用,兼顾合理使用CPU资源和避免内存的浪费

内存淘汰策略

过期删除策略是在大小键值对过期的时候对键值对进行删除的一种策略,而内存淘汰策略,是在内存超过了Redis设置的最大内存时使用内存淘汰策略删除符合条件的键值对

在配置文件 redis.conf 中,可以通过参数 maxmemory 来设定最大运行内存。不同位数的操作系统的默认值是不同的。对于64位的操作系统,默认值为0,也就是没有限制Redis的运行内存,就算实例因内存空间不足而奔溃也置之不理。对于32为的操作系统,默认值为3GB,因为32位操作系统的最大运行内存是4GB,设置3GB是合理的,可以避免Redis内存不足时奔溃。

Redis内存淘汰策略有哪些?

Redis的内存淘汰策略分为“不进行数据淘汰的策略”(Redis3.0之后默认的内存淘汰策略)和“进行数据淘汰的策略”

不进行数据淘汰的策略

Redis运行内存超过了设置的最大运行内存时,只是不允许数据写入,但是查询和删除操作还是可以进行的

进行数据淘汰的策略

进行数据淘汰的策略分为“在设置了过期时间的数据中淘汰”和“在所有数据范围内淘汰”

  • 在设置了过期时间的数据中淘汰

image.png
注意Redis3.0之前是从过期的数据中采用LRU算法进行淘汰

  • 在所有数据范围内淘汰

image.png

设置内存淘汰策略

可以通过命令config set maxmemory-policy <策略>设置,会立即生效,但是Redis重启后就失效了;也可以修改Redis配置文件中的maxmemory-policy <策略>,然后重启Redis生效

Redis中的LRU算法

LRU算法是最近最久未使用算法,Redis4.0后,内存淘汰策略中,对于“过期数据淘汰”和“所有数据进行淘汰”的策略中,都新增了LFU的内存淘汰策略,可见LRU算法的缺陷

  • 传统LRU算法存在的问题
  1. 使用链表维护所有缓存数据,会带来额外的空间开销
  2. 当有数据被访问时,就要移动到链表表头,如果访问的数据量很大,就会带来很多的链表节点移动,很耗时,降低Redis的性能

Redis不是采用传统的LRU算法,而是在每个对象结构体中包含了一个额外字段,记录了这个对象的最后一次访问时间,这样,在进行内存淘汰的时候,直接随机抽取5(默认)个对象,然后淘汰最久没有使用的那个
LRU算法中,lru属性保存的是对象最后一次访问的时间

  • 优点:不需要维护一个链表,没有额外的内存开销;另外,也不需要每次数据访问的时候都移动链表节点,提升了Redis的性能。
  • 缺点:没有办法解决“缓存污染”的问题。如果一个应用一次读取了大量的数据,而且这些数据之后被读取一次的话,那么就可能长期留存在Redis当中,造成缓存污染

Redis中的LFU算法

LRU算法下Redis对象结构体中的lru字段存储的是对象最后一次访问的时间戳,而LFU算法下,Redis对象结构体的lru字段存储的则是对象的访问信息(包括最后一次访问的时间戳 + 访问频次)

last decr time是用来记录key最后一次访问的时间戳
logc的初始值是5,它代表的是key的访问频率,而不是具体的访问次数,会随着时间推移而衰减。数值越小越可能被淘汰。具体而言,每次key被访问的时候,它会根据上次访问距离当前的时长,来对logc进行衰减,距离越长,衰减值越大。然后,再按照一定的概率对logc进行增加,logc值越大的key,越难再增加。
可以通过调整配置文件中的lfu-decay-timelfu-log-factor来调整logc的衰减速度和增长速度

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

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

相关文章

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测 目录 分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结…

Flutter笔记:用于ORM的Floor框架简记

Flutter笔记 用于ORM的Floor框架简记 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133377191 【介绍】&#xff1a;最近想找用于Dart和Flutter的ORM框架&#xff0c;偶然间发现了Floor&#xff0c;觉得还不错&#xff0c;做一些记录。 1. Floor 框…

wsl2 更新报错问题解决记录

1、问题 win10 中安装的 wsl2&#xff0c;启动 docker desktop 时提示 wsl2 有问题&#xff1a; 于是点击推荐的地址连接到微软&#xff0c;下载 wsl2 的更新文件。之后运行&#xff0c;又报错&#xff1a; 更新被卡住。 2、解决方法 WinR 输入 cmd 打开命令行窗口&#x…

Spring面试题7:面试官:Spring是如何进行异常处理的呢?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring是如何进行异常处理的呢? Spring通过异常处理机制来处理应用程序中的异常。它提供了多种方式来处理异常,包括以下几种: 声明式事务管理:…

目标检测如何演变:从区域提议和 Haar 级联到零样本技术

目录 一、说明 二、目标检测路线图 2.1 路线图&#xff08;一般&#xff09; 2.2 路线图&#xff08;更传统的方法&#xff09; 2.3 路线图&#xff08;深度学习方法&#xff09; 2.4 对象检测指标的改进 三、传统检测方法 3.1 维奥拉-琼斯探测器 (2001) 3.2 HOG探测器…

Video Caption / 视频字幕:常用指标(BELU-4,ROUGE-L,METEOR,CIDEr,SPICE)和数据集总结

本文作为入门Video Caption / 视频字幕 的随笔记录&#xff0c;用于查漏补缺和回顾&#xff0c;难免有疏漏和不足指出&#xff0c;烦请指出&#xff01; 一、指标 Video Caption / 视频字幕常用的标准指标有四种&#xff1a;BLEU-1[1]&#xff0c;BLEU-2[1]&#xff0c;BLEU-3[…

Oracle 11g RAC部署笔记

搭了三次才搭好&#xff0c;要记录一下。 1. Oracle 11g RAC部署的相关步骤以及需要的包&#xff0c;可以参考这里。 Oracle 11g RAC部署_12006142的技术博客_51CTO博客Oracle 11g RAC部署&#xff0c;Oracle11gRAC部署操作环境&#xff1a;CentOS7.4Oracle11.2.0.4一、主机网…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 C: 班级活动

[蓝桥杯 2023 国 B] 班级活动 【问题描述】 小明的老师准备组织一次班级活动。班上一共有 n n n 名&#xff08; n n n 为偶数&#xff09;同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 n n …

(三)Python变量类型和运算符

所有的编程语言都支持变量&#xff0c;Python 也不例外。变量是编程的起点&#xff0c;程序需要将数据存储到变量中。 变量在 Python 内部是有类型的&#xff0c;比如 int、float 等&#xff0c;但是我们在编程时无需关注变量类型&#xff0c;所有的变量都无需提前声明&#x…

腾讯云cvm云硬盘扩容

过去一直记得腾讯云的系统盘扩容,关于系统盘的扩容直接点资源调整-云硬盘扩容 系统盘扩容后就可以直接使用的&#xff1f; 但是现在操作了发现vda 200G 但是现在vda1不能自动扩容了&#xff1f; 腾讯云cvm云硬盘扩容 先看一眼官方文档吧&#xff1a;在线扩展系统盘分区及文…

Unity如何生成随机数(设置种子)

文章目录 随机类整数二维向量三维向量种子其他文章 随机类 我们可以使用Random类来生成一些随机数 Random类是用于生成随机数的类之一。它可以用于生成不同类型的随机数&#xff0c;如整数、浮点数和向量。 整数 我们可以使用Random.Range来生成指定范围内的随机整数或浮点数…

22 mysql range 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

Spring Boot:利用JPA进行数据库的增改

目录 JPA介绍Service接口Service和Autowired示例代码 Dao数据库操作层Repository示例代码 控制器文件示例代码-增加增加成功示例代码-修改修改成功 JPA介绍 JPA&#xff08;Javaa Persistence API)一种用于持久化 Java 对象到关系型数据库的标准规范。它提供了一种统一的方式来…

Linux 压缩和解压

1、tar命令&#xff08;复杂&#xff09; 使用tar命令均可以进行压缩和解压缩的操作 语法&#xff1a;tar [-c -v -x -f -z -C] 参数1 参数2 ... 参数N -c&#xff0c;创建压缩文件&#xff0c;用于压缩模式 -v&#xff0c;显示压缩、解压过程&#xff0c;用于查看进度 -x&am…

自动化测试工具之Selenium IDE录制教程

一、下载Selenium IDE 下载传送带&#xff1a;Selenium IDE Open source record and playback test automation for the web 这里Darren洋以firefox火狐浏览器为例&#xff0c;将以上下载url直接在firefox浏览器中打开&#xff0c;点击对应下载按钮后&#xff0c;就会进入添加…

ESP32IDF出现Syntax Warning in cmake code at column 47报错

前言 &#xff08;1&#xff09;ESP32的资料还是挺难找的&#xff0c;遇到bug处理起来挺折磨人的。今天分享一个我遇到的bug&#xff0c;以及处理思路。 报错日志 &#xff08;1&#xff09;前天在些博客的时候&#xff0c;做测试发现了一个奇怪的bug&#xff0c;报错日志如下。…

源码:TMS FlexCel Studio for .NET 7.19

TMS FlexCel Studio for .NET 是100% 托管代码 Excel 文件操作引擎以及 Excel 和 PDF 报告生成&#xff0c;适用于 .NET、Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Windows Phone 和 Windows Store 功能概述 使用 FlexCel Studio for .NET 创建可动态快速读写 Excel 文件的…

Vue封装全局SVG组件

1.SVG图标配置 1.安装插件 npm install vite-plugin-svg-icons -D 2.Vite.config.ts中配置 import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path export default () > {return {plugins: [createSvgIconsPlugin({// Specify the icon fo…

小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务

小米作为全球知名的科技巨头公司&#xff0c;已经在数百款产品中广泛应用了 AI 技术&#xff0c;这些产品包括手机、电视、智能音箱、儿童手表和翻译机等。这些 AI 应用主要都是通过小米的深度学习训练平台完成的。 在训练平台的存储方案中&#xff0c;小米曾尝试了多种不同的…

【Python基础】常用模块学习:sys|os|pytest

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…