redis-内存回收机制

在 Redis 的源码中,redisDb 结构体用于表示一个 Redis 数据库实例。结构体大致如下

typedef struct redisDb {
    dict *dict;                 // 存储键值对的字典
    dict *expires;              // 存储键的过期时间的字典
    dict *blocking_keys;        // 阻塞键的字典
    dict *ready_keys;           // 准备就绪键的字典
    dict *watched_keys;         // 被 WATCH 命令监视的键的字典
    int id;                     // 数据库的编号
    long long avg_ttl;          // 平均过期时间
    unsigned long expires_cursor; // 过期字典的迭代器游标
} redisDb;
  1. dict: 这是一个指向字典的指针,字典用来存储数据库中的所有键值对。这是数据库的主数据结构。(字典是一个用哈希表实现的数据结构用于保存key和value)

  2. expires: 这也是一个指向字典的指针,用于存储具有过期时间的键。键是数据库中的键,而值是过期时间(UNIX 时间戳)。(不存储内容,存储key和其过期时间)

  3. blocking_keys: 这个字典存储那些正在阻塞某些命令(如 BLPOP)的键。键为阻塞的键,值为阻塞这些键的客户端列表。(某些对数据执行的命令会有阻塞效果,这些数据被保存在这里)

  4. ready_keys: 存储那些已准备就绪以供阻塞命令处理的键。(命令条件达成,不需要阻塞了)

  5. watched_keys: 当使用事务和 WATCH 命令时,这个字典会存储被监视的键。如果这些键在事务执行之前被修改,事务将被中断。(使用watch监听某一数据,该数据会被保存在这,比如执行事务时可以先监听一个数据,当这个数据发生更改,则事务作废)

  6. id: 数据库的索引编号,Redis 配置中可以设置多个数据库,这个编号就是用来标识每个数据库的。

  7. avg_ttl: 这表示数据库中所有设置了过期时间的键的平均过期时间。

  8. expires_cursor: 这是用于渐进式地清理过期键的内部迭代器的游标。(redis在进行周期性删除时,该值则记录了清理任务的当前执行位置,因为redis数据庞大,无法一次清理完成,需要记录上一次的清理位置,再次清理时,在这个位置以后继续清理,这个位置的记录就叫游标)

过期key的淘汰有两种方式

1.惰性删除:这种删除方式是当我们使用这个数据时才回去检查过期时间,如果过期,则删除该缓存。

2.周期删除:周期删除是指redis按一定频率抽查设置了过期时间的key是否过期,并且由expiers_cursor配合记录清理位置,它包括两种模式

slow模式:这种模式下按照server.hz配置的参数的频率执行清理任务,假如说将其设置为10,那么该模式下,redis将每秒执行十次清理,并且每次执行时间不能超过25ms

fast模式:该模式下将在一个循环中不断执行清理操作,并且保证两次清理任务之间间隔不低于2ms,并且每次清理操作执行不能超过1ms

当redis内存爆满时,他将依据既定的内存淘汰策略来清理内存,包括如下:

noeviction : 不淘汰任何 key ,但是内存满时不允许写入新数据,默认就是这种策略。
volatile-ttl : 对设置了 TTL 的 key ,比较 key 的剩余 TTL 值, TTL 越小越先被淘汰
allkeys-random :对全体 key ,随机进行淘汰。也就是直接从 db->dict 中随机挑选
volatile-random :对设置了 TTL 的 key ,随机进行淘汰。也就是从 db->expires 中随机挑选。
allkeys-lru : 对全体 key ,基于 LRU 算法进行淘汰
volatile-lru : 对设置了 TTL 的 key ,基于 LRU 算法进行淘汰
allkeys-lfu : 对全体 key ,基于 LFU 算法进行淘汰
volatile-lfu : 对设置了 TTL 的 key ,基于 LFI 算法进行淘汰

ttl表示过期时间

其中allkeys表示对全体key,volatile表示设置了过期时间的key,lru和lfu分别是两种算法,random表示随机

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

无论是LRU还是LFU,在进行淘汰key的比较时都是比较redisobject结构体中的lru属性的值,而lru属性在LRU相关模式下会记录最近访问时间戳,在LFU模式化会用一个简单的算法记录访问频率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spark】 Spark核心概念、名词解释(五)

Spark核心概念 名词解释 1)ClusterManager:在Standalone(上述安装的模式,也就是依托于spark集群本身)模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器ResourceManager(国内s…

编程入门(六)【Linux系统基础操作三】

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 🔥前言🚀LInux的进程管理和磁盘管理top命令显示查看进…

SpringBoot整合Redis(文末送书)

文章目录 Redis介绍使用IDEA构建项目,同时引入对应依赖配置Redis添加Redis序列化方法心跳检测连接情况存取K-V字符串数据(ValueOperations)存取K-V对象数据(ValueOperations)存取hash数据(HashOperations&a…

2024年武汉市工业投资和技术改造及工业智能化改造专项资金申报补贴标准、条件程序和时间

一、申报政策类别 (一)投资和技改补贴。对符合申报条件的工业投资和技术改造项目,依据专项审计报告明确的项目建设有效期(最长不超过两年)内实际完成的生产性设备购置与改造投资的8%,给予最高不超过800万元专项资金支持。 (二)智能化改造补贴。对符合申报条件的智能化改造项目…

互联网产品为什么要搭建会员体系?

李诞曾经说过一句话:每个人都可以讲5分钟脱口秀。这句话换到会员体系里面同样适用,每个人都能聊点会员体系相关的东西。 比如会员体系属于用户运营的范畴,比如怎样用户分层,比如用户标签及CDP、会员积分、会员等级、会员权益和付…

鸿蒙通用组件弹窗简介

鸿蒙通用组件弹窗简介 弹窗----Toast引入ohos.promptAction模块通过点击按钮,模拟弹窗 警告对话框----AlertDialog列表弹窗----ActionSheet选择器弹窗自定义弹窗使用CustomDialog声明一个自定义弹窗在需要使用的地方声明自定义弹窗,完整代码 弹窗----Toa…

Seata之TCC 模式的使用

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能…

【python数据分析基础】—pandas透视表和交叉表

目录 前言一、pivot_table 透视表二、crosstab 交叉表三、实际应用 前言 透视表是excel和其他数据分析软件中一种常见的数据汇总工具。它是根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。 一、pivot_table 透视表 pivot_tabl…

风与水如何联合优化?基于混合遗传算法的风-水联合优化运行程序代码!

前言 为提高风电场的供电质量同时增加其发电效益,利用储能技术为风电场配置一个蓄能系统是比较重要的解决措施之一。风电的蓄能技术有水力蓄能、压缩空气蓄能、超导磁力蓄能、流体电池组、电解水制氢等,其中水力蓄能是技术较成熟的一种蓄能方式,且小型的…

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码,再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面,进入后会存下cookies值&…

项目经理【过程】概念

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 【人】绩效 【过程】概念 一、过程是什么 1.1 项目管理五大过程组 1.2 五大过程组之间的相互作用 1.3 项目阶段VS过…

《Linux运维总结:ARM架构CPU基于docker-compose一离线部署consul v1.18.1集群工具》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

【SpringBoot】-- 监听容器事件、Bean的前后置事件

目录 一、ApplicationContextInitializer 使用 1、自定义类,实现ApplicationContextInitializer接口 2、在META-INF/spring.factories配置文件中配置自定义类 二、ApplicationListener 使用 1、自定义类,实现ApplicationListener接口 2、在META-…

tensorboard子目录运行

tensorboard默认在根目录运行,浏览器访问127.0.0.1:6006打开界面。 如果想在子目录运行,那么可以这么执行 tensorboard --logdir ./logs --path_prefix/app/asd 然后浏览器既可以通过 http://localhost:6006/app/asd/来访问。​​​​​​ 但这么做遇…

HADOOP之YARN详解

目录 一、YARN的简介 1.1 MapReduce 1.x 1.1.1 MapReduce 1.x的角色 1.2 YARN的介绍 1.3 YARN的设计思想 二 YARN的配置 1. mapred-site.xml 2. yarn-site.xml ​编辑 3. hadoop-env.sh 4. 分发到其他节点 5.YARN的服务启停 6. 任务测试 三 YARN的历史日志 1. 历…

JetBrains的多数据库管理和SQL工具DataGrip 2024.1版本在Windows/Linux系统的下载与安装配置

目录 前言一、DataGrip在Windows安装二、DataGrip在Linux安装三、Windows下使用配置四、Linux下使用配置总结 前言 ​ “ DataGrip是一款多数据库管理和SQL工具,适用于不同类型的数据库。它提供了丰富的功能和工具,可以帮助开发人员更高效地管理数据库、…

【Linux网络编程】4.TCP协议、select多路IO转换

目录 TCP协议 TCP通讯时序 三次握手 四次挥手 滑动窗口 测试代码1 测试结果 Address already in use解决方法 批量杀进程 测试代码2 测试结果 测试代码4 测试结果 TCP状态转换 主动发起连接请求端 主动关闭连接请求端 被动接收连接请求端 被动关闭连接请求端…

浅谈自己用过最好用的AI工具概括

个人最经常用的AI工具的其实是Copilot,但是也有别的一些最好用的AI工具,包括: OpenAI GPT-3:这是一个自然语言生成模型,具有强大的语言理解和生成能力。它可以用于各种任务,如文字生成、自动回复和文本摘要…

1984. 学生分数的最小差值C++

给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。 从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。 返回可能的 最小差值 。 示例 1: 输入&…

台灯的十大品牌有哪些?十大护眼灯品牌推荐

相信细心的家长已经发现,自家孩子随着步入更高的年级,每天晚上学习的时间也越来越晚了,而这个过程中必然少不了一盏好的台灯! 市场上有不少网红代言的护眼灯,虽然它们销售量高,但其实缺乏专业技术和安全保障…
最新文章