Redis内存策略

1.Redis中Key的过期策略

问题1:Redis是如何知道一个key是否过期呢?

        Redis会利用两个字典分别记录key-value对(dict)以及key-ttl对(expires)。

1.1 立即删除

        在设置键的过期时间时,会创建一个回调事件,当过期时间达到时, 自动执行回调事件去删除键。但是立即删除对 cpu 是最不友好的。

1.2 惰性删除

        惰性删除是指某个键值过期后,此键值不会马上被删除,而是等到下次访问该键值的时候,等到去expires中去查询才会发现过期了,此时才会删除。但是如果过期了,后面不在访问的话,就会一直在expires中,所以惰性删除的缺点就是会浪费内存

        由上面的两幅图我们发现其实在执行写操作和读操作时,都会先去expires字典中检查key是否过期。  

1.3 周期删除

通过一个定时任务,周期性的抽样部分的key,然后对过期的key执行删除。执行周期有两种:

1.Redis初始化时会设置一个定时任务serverCron(),按照server.hz的频率来执行过期key清理,模式为SLOW。

SLOW模式规则:

(1)执行频率受到server.hz的影响,默认为10,即每秒执行10次,每一个周期100ms。

(2)执行清理耗时不能超过一个周期时间的25%(即25ms)。

(3)逐个遍历,抽取20个key判断是否过期。

(4)如果没达到时间上限(25ms)并且过期key比列大于10%,则再进行一次抽样,否则结束。

2.Redis的每个事件循环前会调用beforeSleep()函数,执行过期key清理,模式为FAST。

FAST模式规则:

(1)与beforeSleep()(在注册FD监听前执行)调用频率有关,但是两次调用间隔不能低于2ms,如果低了,直接越过。

(2)执行清理耗时不超过1ms。

(3)逐个遍历,抽取20个key判断是否过期。

(4)如果没达到时间上限(1ms)并且过期key比列大于10%,则再进行一次抽样,否则结束。

1.4三种删除方式总结

可以看到,第二种为被动删除第一种和第三种为主动删除,且第三种实时性更高。每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对 cpu 的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。

所以redis使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用

2.淘汰策略

        内存淘汰:就是当Redis内存使用达到设置的阈值时,Redis主动挑选部分key删除以释放更多内存的流程。在配置文件中可以进行设置淘汰策略:

Redis支持8种不同策略来选择要删除的key,如下:

  • noeviction(默认):不淘汰任何key,但是内存满时不允许写入新数据。

  • volatile-TTL:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰。

  • allkeys-Random:对全体的key,随机进行淘汰。也就是直接从db->dict中随机挑选。

  • volatile-Random:对设置了TTL的key,随机进行淘汰。也就是从expires中随机挑选。

  • allkeys-LRU:对全体key,基于LRU算法进行淘汰。

  • volatile-LRU:对设置了TTL的key,基于LRU算法进行淘汰。

  • allkeys-LFU:对全体的key,基于LFU算法进行淘汰。

  • volatile-LFU:对设置了TTL的key,基于LFU算法进行淘汰。

    总体的流程如下:

 

手写LRU算法:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

手写LFU算法:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 

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

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

相关文章

JVM垃圾收集器三色标记算法

垃圾收集算法 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比…

RK3568平台 PWM Backlight控制背光亮度

一.PWM基本概念 以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。 假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获…

【小沐学Unity3d】3ds Max 减面工具汇总

文章目录 1、简介2、“优化”修改器3、“专业优化”修改器4、“多分辨率”修改器5、Polygon Cruncher5.1 工具简介5.2 下载安装5.3 使用测试 6、Simplyon6.1 工具简介6.2 下载安装6.3 使用测试 7、FAQ7.1 在3dmax里面显示点数和面数 结语 1、简介 有几个 3ds Max 修改器可帮助您…

C#上位机与欧姆龙PLC的通信03----创建项目工程

1、创建仿真PLC 这是一款CP1H-X40DR-A的PLC,呆会后面创建工程的时候需要与这个类型的PLC类型一致,否则程序下载不到PLC上。 2、创建虚拟串口 首先安装,这个用来创建虚拟串口来模拟真实的串口,也就是上位机上有那种COM口&#xf…

map|动态规划|单调栈|LeetCode975:奇偶跳

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 涉及知识点 单调栈 动态规划 map 题目 给定一个整数数组 A,你可以从某一起始索引出发,跳跃一定次数。在你跳跃的过程中,第 1、3、5… 次跳跃称为奇数跳跃,而第 2、…

文件传输软件SecureFX mac支持多种协议

SecureFX mac是一款文件传输客户端,可在 Mac 操作系统上使用。它由 VanDyke Software 公司开发,旨在为用户提供安全、可靠、高效的文件传输服务。 SecureFX 支持多种协议,包括 SFTP、SCP、FTP、FTP over SSL/TLS 和 HTTP/S。它使用强大的加密…

Android 13 - Media框架(24)- OMXNodeInstance(一)

为了了解 ACodec 是如何与 OpenMAX 组件进行 buffer 流转的,我们有必要先来学习 OMXNodeInstance,在前面的章节中,我们已经了解了 media.codec 进程包含的内容,以及 OpenMAX 框架中的一些内容。这一节我们将来学习 OMXNode 与 med…

泛微OA C# 调用 WebAPI功能实现

泛微OA C# 调用 WebAPI功能实现 OA 在线文档地址1. 创建流程字段参数 mainData 简单说明字段表明细表2. 接口封装2.1 接口初始化2.2 接口注册2.3 获取Token2.4 拼装 Headers2.5 常用工作流方法2.5.1 创建2.5.2 删除2.5.3 撤回2.5.4 退回3. 接口调用OA 在线文档地址 Token认证 …

Qt前端技术:2.QSS

border-style:后边是两个参数的话第一个参数改变上下的style 第二个参数改变左右的style 如果后边是三个参数的话第一个参数改变上边的style第二个参数改变左右的style,第三个参数改变的下边的style 如果后边是四个参数的话对应的顺序为上,右…

ros2机器人常规控制流程

The joint_state_publisher reads the robot_description parameter from the parameter server, finds all of the non-fixed joints and publishes a JointState message with all those joints defined.也就是说如果我们不需要控制机器人运动,只需要一个节点就可…

HarmonyOS概述

HarmonyOS概述 HarmonyOS系统架构 内核层—系统服务层—框架层—应用层 内核层: 内核子系统: HarmonyOS采用多内核设计,支持针对不同资源受限设备 ,选用适合的OS内核,为上层提供基础操作系统能力。驱动子系统: 硬件驱动框架(H…

AI百模大战:引领行业变革与开启人才黄金时代

🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 技术进步:AI的飞速发展 1. 深度学习的多领域应用 2. 自然语言处理的语境理解提升 3. 计算机视觉的实时处理能力提高 4…

清风数学建模学习笔记-斯皮尔曼相关系数

内容:斯皮尔曼相关系数 一.原理: 二.算法: 1.MATLAB: 2.SPSS: 分析-相关-双变量相关-勾选标注显著性相关性 3. 相关性系数的选择:

【vCenter Converter】安装 VMware vCenter Converter Standalone

目录 3.2 开始安装 (具体步骤) 关联博文参考资料 3.2 开始安装 (具体步骤) 点击安装程序后,进入安装导向。 终端用户协议。 接受终端用户协议。 指定安装位置。 指定安装类型,默认本地安装即可。 加入VMware用户体验计划。 准备安装。 安装中。 安装完成…

Open5GSUeRANSim2:对安装在同一个VM上的OPEN5GS和UERANSIM进行配置和抓取wireshark报文

参考链接: Configuring SCTP & NGAP with UERANSIM and Open5GS on a Single VM for the Open5GS & UERANSIM Series https://www.youtube.com/watch?vINgEX5L5fkE&listPLZqpS76PykwIoqMdUt6noAor7eJw83bbp&index5 Configuring RRC with UERANSI…

Python 运维(一):Python 包管理器 pip 的使用指南

大家好,我是水滴~~ 本文将介绍了 Python 的包管理器 pip 的基本使用、常用命令、帮助信息,以及一些常见问题。文章内容包含大量的示例代码,希望能够帮助新手同学快速入门。 《Python入门核心技术》专栏总目录・点这里 文章目录 1. 包管理器1…

Axure基础

软件: 简单交互动效 动态面板 显示和隐藏 表单元件 表格设计 内联框架 导航菜单 元件交互样式 滚动屏幕与弹幕

JAVA线上事故:递归导致的OOM

最近因为人员离职,接手一个项目,是xxljob的客户端,部署在k8s上,在排查线上工单时,发现了一个问题: 在管理界面上,我惊讶的发现,三个月的时间,2个Pod,每个都重…

代码随想录-刷题第三十三天

122. 买卖股票的最佳时机II 题目链接:122. 买卖股票的最佳时机 II 思路:题目中利润是可以分解的。 加入第0天买入,第三天卖出,利润为price[3] - price[0]。其利润可以分解成(prices[3] - prices[2]) (prices[2] - prices[1]) …

Github 2023-12-21 开源项目日报 Top10

根据Github Trendings的统计,今日(2023-12-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4Go项目1Jupyter Notebook项目1C#项目1Solidity项目1TypeScript项目1C项目1CSS项目1 GPT-Engineer…