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.mzph.cn/web/6959.shtml

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

相关文章

子比主题小黑屋列表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤1.引入库前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文…

五一假期后,必读的10篇大模型论文

1.同时预测多个 token:更好更快的大型语言模型 目前,GPT 和 Llama 等大型语言模型(LLMs)都是通过下一个 token 预测损失来训练的。 在这项工作中,来自 Meta FAIR 的研究团队认为,训练语言模型同时预测多个…

用 Go map 要注意这个细节,避免依赖他!

有的小伙伴没留意过 Go map 输出、遍历顺序,以为它是稳定的有序的,会在业务程序中直接依赖这个结果集顺序,结果栽了个大跟头,吃了线上 BUG。 有的小伙伴知道是无序的,但却不知道为什么,有的却理解错误? 今…

PADS 规则设置-导线不跟随器件-导线允许回路

1、PADS Layout中设置拖动器件时导线不跟着移动 2、PADS Router中设置走线允许回路

【隧道篇 / WAN优化】(7.4) ❀ 01. 启动WAN优化 ❀ FortiGate 防火墙

【简介】几乎所有的人都知道,防火墙自带的硬盘是用来保存日志,以方便在出现问题时能找到原因。但是很少的人知道,防火墙自带的硬盘其实还有另一个功能,那就是用于WAN优化。 防火墙自带的硬盘 在FortiGate防火墙A、B、C、D系列&…

【备战软考(嵌入式系统设计师)】04-嵌入式软件架构

嵌入式操作系统 嵌入式系统有以下特点: 要求编码体积小,能够在有限的存储空间内运行。 面向应用,可以进行裁剪和移植。 用于特定领域,可以支持多任务。 可靠性高,及时响应,无需人工干预独立运行。 实…

软件全套资料整理包获取-软件各阶段支撑文档

软件全套精华资料包清单部分文件列表: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书,概要设计说明书&#xff0c…

动手写一个简单的Android 表格控件支持固定列

Android 动手写一个简洁版表格控件 简介 源码已放到 Github Gitee 作为在测绘地理信息行业中穿梭的打工人,遇到各种数据采集需求,既然有数据采集需求,那当然少不了数据展示功能,最常见的如表格方式展示。 当然,类似…

大模型时序预测初步调研20240506

AI预测相关目录 AI预测流程,包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

MySQL —— 表的基本操作

一、创建 1.语法 create table 表名称( 自定义变量1, 自定义变量2, 自定义变量3(最后一个变量末尾不需要加任何标点符号) )charset字符集 collate校验集 engine存储引擎; ps:若是不具体给字符集、校验集、储存引擎,则采用配置文件…

Prop 校验

Vue 组件可以更细致地声明对传入的 props 的校验要求。比如我们上面已经看到过的类型声明,如果传入的值不满足类型要求,Vue 会在浏览器控制台中抛出警告来提醒使用者。这在开发给其他开发者使用的组件时非常有用。 要声明对 props 的校验,你…

C#面:当线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法

不能,一个对象的一个synchronized方法只能由一个线程访问 当一个线程进入一个对象的synchronized方法后,其他线程是无法进入该对象的其他synchronized方法的。这是因为synchronized关键字可以确保同一时间只有一个线程可以进入被标记为synchronized的方…

Python氮氧甲烷乙烷乙烯丙烯气体和固体热力学模型计算

🎯要点 🎯固体和粒子:计算二态系统、简谐振子和爱因斯坦固体的内能和比热,比较爱因斯坦固体和德拜固体。模拟多个粒子的一维和二维随机游走,在数值上确认方差的线性趋势,模拟多个粒子的梯度下降&#xff0…

[Unity]备份许可文件

原因:因Unity需要重新恢复出厂设置,所以需要先将许可文件本分到本地,以便重新初始化后输入许可。 1)登录管理网络web界面,在服务页面打开SSH 2)ssh到管理网络,使用service用户登录 3&#xf…

『跨端框架』Flutter环境搭建

『跨端框架』Flutter环境搭建 资源网站简介跨平台高性能发展历程跨平台框架的比较成功案例 环境搭建(windows)基础环境搭建Windows下的安卓环境搭建Mac下的安卓环境配置资源镜像JDKAndroid StudioFlutter SDK问题一问题二问题三修改项目中的Flutter版本 …

厂家自定义 Android Ant编译流程源码分析

0、Ant安装 Windows下安装Ant: ant 官网可下载 http://ant.apache.org ant 环境配置: 解压ant的包到本地目录。 在环境变量中设置ANT_HOME,值为你的安装目录。 把ANT_HOME/bin加到你系统环境的path。 Ubuntu下安装Ant: sudo apt…

visio studio 中.NET Core(.net8.0)框架和.net framewok 框架有什么区别?

更新vs到2022版本后,新建项目时就多出不少选项,这里来个大家分享下.NET Core(.net8.0)框架和.net framewok的区别 如下图,不带后缀的就是使用.NET Core框架,后续选项是.net8.0。 .net framewok框架选项&am…

从0到1:商场导览小程序开发笔记一

背景 购物中心与商场小程序:旨在提供便捷的购物、导航、活动报名、服务查询等功能,让用户更好地体验购物和享受服务。通过提供便捷的购物、信息查询和互动预约等功能,提升了商场的服务水平和用户体验,帮助商场与消费者建立更紧密…

YOLOv5入门(四)训练自己的目标检测模型

前言 通过前面几篇文章,已经完成数据集制作和环境配置(服务器),接下来将继续实践如何开始训练自己数据集~ 往期回顾 YOLOv5入门(一)利用Labelimg标注自己数据集 YOLOv5入门(二)处…

c++Dijkstra算法

求单源最短路问题 #include<iostream> #include<cstring> using namespace std; const int N1001; const int M10001; struct edge{//v表示这条边连接顶点编号//w边权 。next下一条边的顶点编号 int v,w,next;edge(){}edge(int _v,int _w,int _next){v_v;w_w;next…