Redis 内存策略
一、Redis 内存回收
Redis 之所以性能强,最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大,会影响持久化或主从同步性能。
我们可以通过修改配置文件来设置 Redis 的最大内存:
# 格式:
# maxmemory <bytes># 例如:
maxmemory 1gb
当内存使用达到上限时,就无法存储更多数据了。为了解决这个问题,Redis 提供了一些策略实现内存回收:内存过期策略和内存淘汰策略。
二、过期策略
在学习 Redis 缓存的时候我们说过,可以通过 expire 命令给 Redis 的 key 设置 TTL(存活时间):
可以发现,当 key 的 TTL 到期以后,再次访问 name 返回的是 nil,说明这个 key 已经不存在了,对应的内存也得到释放。从而起到内存回收的目的。
这里有两个问题需要我们思考:Redis 是如何知道一个 key 是否过期呢?是不是 TTL 到期就立即删除了呢?
2.1 DB 结构
Redis 本身是一个典型的 key-value 内存存储数据库,因此所有的 key、value 都保存在之前学习过的 Dict 结构中。不过在其 database 结构体中,有两个 Dict:一个用来记录 key-value;另一个用来记录 key-TTL。其结构体如下图所示:
所以 Redis 是利用两个 Dict 分别记录 key-value 对及 key-ttl 对来知道 key 是否过期了。
是不是 TTL 到期就立即删除了呢,当然不是,还要经历惰性删除和周期删除两个阶段。
2.2 惰性删除
惰性删除:顾明思议并不是在 TTL 到期后就立刻删除,而是在访问一个 key 的时候,检查该 key 的存活时间,如果已经过期才执行删除。
2.3 周期删除
周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的 key,然后执行删除。执行周期有两种模式,分别为 SLOW 模式和 FAST 模式。
SLOW 模式:Redis 服务初始化函数 initServer() 中设置定时任务,按照 server.hz 的频率来执行过期 key 清理,模式为 SLOW。
FAST 模式:Redis 的每个事件循环前会调用 beforeSleep() 函数,执行过期 key 清理,模式为 FAST。
2.3.1 SLOW 模式规则
1、执行频率受 server.hz 影响,默认为 10,即每秒执行 10 次,每个执行周期 100ms。
2、执行清理耗时不超过一次执行周期的 25%.默认 slow 模式耗时不超过 25ms
3、逐个遍历 db,逐个遍历 db 中的 bucket,抽取 20 个 key 判断是否过期
4、如果没达到时间上限(25ms)并且过期 key 比例大于 10%,再进行一次抽样,否则结束
2.3.2 FAST 模式规则
过期 key 比例小于 10% 不执行
1、执行频率受 beforeSleep() 调用频率影响,但两次 FAST 模式间隔不低于 2ms
2、执行清理耗时不超过 1ms
3、逐个遍历 db,逐个遍历 db 中的 bucket,抽取 20 个 key 判断是否过期
4、如果没达到时间上限(1ms)并且过期 key 比例大于 10%,再进行一次抽样,否则结束。
2.4 小结
RedisKey 的 TTL 记录方式:
1、在 RedisDB 中通过一个 Dict 记录每个 Key 的 TTL 时间
过期 key 的删除策略:
1、惰性清理:每次查找 key 时判断是否过期,如果过期则删除
2、定期清理:定期抽样部分 key,判断是否过期,如果过期则删除。
定期清理的两种模式:
1、SLOW 模式执行频率默认为 10,每次不超过 25ms
2、FAST 模式执行频率不固定,但两次间隔不低于 2ms,每次耗时不超过 1ms
三、淘汰策略
我们上一小节学习了 redis 的过期策略,但是这种方式只能将过期的 key 给它移除。但是在一些庞大的项目上,数据量非常的多。很有可能仅仅淘汰过期的 key,也难以满足内存的使用。内存也有可能达到上限。此时就需要内存淘汰策略了。
3.1 内存淘汰
就是当 Redis 内存使用达到设置的上限时,主动挑选部分 key 删除以释放更多内存的流程。
只要有任何的命令写入,redis 都会检查内存是否够用,只要不够都会去清理内存,如下代码,Redis 会在处理客户端命令的方法 processCommand() 中尝试做内存淘汰:
int processCommand(client *c) {// 如果服务器设置了server.maxmemory属性,并且没有执行lua脚本if (server.maxmemory && !server.lua_timedout) {// 尝试进行内存淘汰performEvictionsint out_of_memory = (performEvictions() == EVICT_FAIL);// ...if (out_of_memory && reject_cmd_on_oom) {rejectCommand(c, shared.oomerr);return C_OK;}// ....}
}
3.2 淘汰策略
Redis 支持 8 种不同策略来选择要删除的 key,我们也可以修改配置文件来设置不同的策略,设置的位置如下图所示:
1、noeviction: 不淘汰任何 key,但是内存满时不允许写入新数据,会报错,默认就是这种策略。
2、volatile-ttl: 对设置了 TTL 的 key,比较 key 的剩余 TTL 值,TTL 越小越先被淘汰。
3、allkeys-random:对全体 key ,随机进行淘汰。也就是直接从 db->dict 中随机挑选。
4、volatile-random:对设置了 TTL 的 key ,随机进行淘汰。也就是从 db->expires 中随机挑选。
5、allkeys-lru: 对全体 key,基于 LRU 算法进行淘汰。
6、volatile-lru: 对设置了 TTL 的 key,基于 LRU 算法进行淘汰。
7、allkeys-lfu: 对全体 key,基于 LFU 算法进行淘汰。
8、volatile-lfu: 对设置了 TTL 的 key,基于 LFU 算法进行淘汰。
比较容易混淆的有两个:
LRU(Least Recently Used),最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
LFU(Least Frequently Used),最少频率使用。会统计每个 key 的访问频率,值越小淘汰优先级越高。
3.3 整体流程图
相关文章:

Redis 内存策略
一、Redis 内存回收 Redis 之所以性能强,最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大,会影响持久化或主从同步性能。 我们可以通过修改配置文件来设置 Redis 的最大内存: # 格式: # maxmemory <byt…...
Java小实验————斗地主
早期使用的JavaSE用到的技术栈有:Map集合,数组,set集合,只是简单实现了斗地主的模拟阶段,感兴趣的小伙伴可以调试增加功能 代码如下: import java.util.*;public class Poker {public static void main(String[] arg…...
【Oracle】Linux 卸载重装 oracle 教程(如何清理干净残留)系统 CentOS7.6
总览 1.停止监听 2.删除 Oracle 数据库实例 3.删除 Oracle 相关服务 4.删除 Oracle 服务脚本 5.清理 Oracle 软件和配置文件 6.强制卸载 Oracle 软件包 一、开始干活(所有操作使用 root 权限,在 root 用户下执行) 1.停止监听 lsnrctl sto…...

web中间件漏洞-Jenkins漏洞-弱口令、反弹shell
web中间件漏洞-Jenkins漏洞-弱口令、反弹shell Jenkins弱口令 默认用户一般为jenkins/jenkins 使用admin/admin123登陆成功 Jenkins反弹shell 格式为 println"命令".execute().text 在/tmp目录中生成shell.sh文件,并向其中写入反弹shell的语句 new…...
Linux开发讲课9--- Linux的IPC机制-内存映射(Memory Mapping)
Linux的IPC(Inter-Process Communication,进程间通信)机制是多个进程之间相互沟通的方法,它允许不同进程之间传播或交换信息。Linux支持多种IPC方式,包括但不限于: 管道(Pipe)&#…...

Java赋值运算符
Java赋值运算符分为以下: 符号 作用 说明 赋值 int a 10,把10赋值给变量a 加后赋值 ab,将ab的值赋值给变量a - 减后赋值 a-b,将a-b的值赋值给变量a* 乘后赋值 a*b,将a*b的值赋值给变量a / 除后赋值 a/b,将a/b的值赋值给变量a % 取余赋值 a%b,将a%b的值赋值给变量…...

Qt做群控系统
群控系统顾名思义,一台设备控制多台机器。首先我们来创造下界面。我们通过QT UI设计界面。设计界面如下: 登录界面: 登录界面分为两种角色,一种是管理员,另一种是超级管理员。两种用户的主界面是不同的。通过选中记住…...
【专业英语 复习】第10章 Information System
1. 单选题 (1分) An example of this type of report would be a sales report that shows that certain items are selling significantly above or below forecasts. () A. Inventory B. Demand C. Periodic D. Exception 正确答案: D 这种类型的报…...

09-axios在Vue中的导入与配置
09-axios 前言首先简单了解什么是Axios?以上完成后就可以使用了 前言 我们接着上一篇文章 08-路由地址的数据获取 来讲。 下一篇文章 10-vuex在Vue中的导入与配置 首先简单了解什么是Axios? Axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端…...

odoo17 小变更4
odoo17 小变更4 1、代码中去除了访问私人地址权限,但翻译中均还有,怪不 model:res.groups,name:base.group_private_addresses msgid "Access to Private Addresses" msgstr "" 代码也查看了,的确没有了此权限组 --><record model="res.g…...
Flink assignTimestampsAndWatermarks 深度解析:时间语义与水印生成
目录 概述 时间语义 时间戳分配 水印的作用 最佳实践 案例分析 注意事项 应用场景 概述 在Apache Flink中,assignTimestampsAndWatermarks是一个重要的方法,它允许数据流处理程序根据事件时间(event time)分配时间戳和生成水印(watermarks)。这个方法通常用于处理…...
C++排序算法——合并有序数组
合并有序数组 思路 我们可以设想一个排序的函数 这个函数里 我们有三个while while(第一次的执行条件) {先进行第一次的合并 } while(第二次的合并条件) { 把a数组在第一次没有排序上的给加进去 }while(第三次的合并条件) { 把b数组在第一次没有排序上的给加进去 }看完了这个…...

安装pytorch环境
安装:Anaconda3 通过命令行查显卡nvidia-smi 打开Anacanda prompt 新建 conda create -n pytorch python3.6 在Previous PyTorch Versions | PyTorch选择1.70,安装成功,但torch.cuda.is_available 返回false conda install pytorch1.7.0…...
内卷从古到今就一直存在,并不是近年的“新物”,破局在于你是否有意识地学习。
一.背景: 反思自己过去从学生时代到职场时代。“内卷”其实已经一直存在,从古到今都一直存在,也并不是近几年产出的“新物”。已经连续5年高考人数在1000万以上,而今年1300多万达到新高,对于竞争压力如此之大…...

跟《经济学人》学英文:2024年6月15日这期 The war for AI talent is heating up
The war for AI talent is heating up Big tech firms scramble to fill gaps as brain drain sets in 争夺人工智能人才的战争正在升温 随着人才流失的到来,大型科技公司争相填补空缺 brain drain:人才流失 scramble:争夺;争…...

港湾周评|高盛眼中的618增长
《港湾商业观察》李镭 年中最重要的购物节618终于尘埃落定了。2024年的618各大电商平台竞技情况如何?又有哪些新的亮点?都成为外界观察消费行为的参考指标。 根据京东618数据显示:累计成交额过10亿的品牌83个,超15万个中小商家销…...
SPSS知识
特点 SPSS的一些特点: 分析结果清晰、直观:SPSS提供了丰富的图表和表格,可以帮助用户直观地理解数据分析的结果。分析结果通常包含详细的统计量、图形和文本描述,使得分析结果易于解释。 易学易用:SPSS的用户界面设计…...

【网络安全的神秘世界】关于Linux中一些好玩的字符游戏
🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 佛祖保佑 把 motd 通过xtp拖到Linux中 liyangUbuntu2204:~$ cp motd /etc/motd #一定要放在etc下 liyangUbuntu2204:~$ exi…...
【LeetCode】Hot100:验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 英文题目 Given the root…...

[Qt] Qt Creator 编译输出乱码,问题页中的报错、警告内容,编译输出乱码
确保文件编码为"UTF-8","如果编码是UTF-8则添加",如下图: 设置IDE环境语言跟随系统语言,Text codec for tools: "System" 瑞斯拜...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...