【Redis】内存淘汰策略

文章目录

  • 什么是内存淘汰策略
  • 设置`Redis`最大内存
  • 执行内存淘汰策略的流程
  • `Redis`的八大内存淘汰策略
  • 深入源码进行理解
  • 内存淘汰策略流程

什么是内存淘汰策略

Redis内存淘汰策略是指当Redis的内存使用达到其配置的最大内存限制maxmemory)时,Redis根据预设的策略自动删除一部分键(key)及其对应的值(value,以释放内存空间,从而避免内存溢出(OOMOut Of Memory)错误的发生。Redis提供了多种内存淘汰策略,以满足不同应用场景的需求。

设置Redis最大内存

Linux系统中,使用命令:vim /etc/redis/redis.conf,打开Redis配置文件.

在这里插入图片描述
如:maxmemory 1gb

执行内存淘汰策略的流程

  • 进行内存淘汰的时机: Redis处理客户端命令之前,都会检查一遍内存,然后尝试淘汰内存
    在前面的学习过程中,我们了解到,在执行Redis命令时,会调用processCommand来进行Redis命令的执行.
    在这里插入图片描述

分析该源码的内容:
在执行Redis命令之前,都会调用processCommand函数,在设定了server.maxmemory属性并且未有执行Lua脚本的情况下,尝试淘汰内存,调用performEvictions()函数,尝试淘汰内存,如果内存淘汰失败,拒绝执行该Redis命令.(因为Redis中默认的内存淘汰策略是noeviction,不进行key的删除,而是直接不允许写入新的数据)

Redis的八大内存淘汰策略

在配置文件中可以对不同的内存淘汰策略进行选择:
打开/etc/redis/redis.conf,Redis的配置文件,找到maxmemory-policy属性.
Redis支持八种不同的策略来选择要删除的key:

  • noeviction:不淘汰任何key,但是内存满时不允许写入新的数据,这是Redis默认的内存淘汰策略
  • volatile-ttl:对设置了ttlkey,比较key的剩余ttl的值,ttl越小越先被淘汰.
  • allkeys-random: - 对全体的key进行随机淘汰,也就是从db->dict(对所有的key)中随机挑选
  • Volatile-random:对设置了ttlkey,随机进行淘汰.也就是从db->expires(对所有带过期时间的key)中随机挑选
  • Allkeys-lru:对全体的key,基于lru算法进行淘汰
  • Volatile-lru:对于设置了ttlkey,基于lru算法进行淘汰
  • Allkeys-lru:对于全体key,基于lfu算法进行淘汰
  • volatile-lfu:对于设置了ttlkey,基于lfu进行淘汰
  • LRU:最少最近使用,用当前的时间减去最后一次访问的时间(即该key多久没有被访问),这个值越大则淘汰的优先级越高.
  • LFU :最少频率使用,会统计每个key的访问概率,值越小淘汰级别越高.

总结八大淘汰策略:

  • 淘汰范围
    • 全体key
    • 全体设置了ttlkey
  • 淘汰算法
    • TTL排序
    • LRU排序
    • LFU排序

深入源码进行理解

redis如何统计key最近的使用时间访问频率呢?
Redis的数据都会被封装为RedisObject结构中:
在这里插入图片描述
LFU的访问次数之所以叫做逻辑访问次数,是因为并不是每次key被访问都计数,而是通过运算:

  1. 生成0~1之间的随机数R
  2. 计算1/(旧次数*lfu_log_factor+1),记录为P,lfu_log_factor默认为10
  3. 如果R<P,则计数器+1,且最大不超过255
  4. 访问次数会随着时间衰减,距离上一次访问时间间隔lfu_decay_time分钟(默认1),计数器-1(比如某个key已经255分钟没有被访问了,就会减少到0,所以LFU的前16位需要记录最近一次访问的时间,单位是分钟)

内存淘汰策略流程

在这里插入图片描述

这里我们重点理解eviction_pool

  • 这里相当于一个淘汰池,因为如果我们每次进行内存淘汰时,都将所有的key进行精确的排序,所消耗的时间是相当大的,所以这里进行了一个相对精确的筛选,也就是从每个DB中随机选取maxmemory_samples个数据进入淘汰池中,再按照选择的淘汰算法(TTL,LRU,LFU)进行排序.
  • 这里我们注意到此处的idleTime的计算方式:
    • TTL算法:maxTTL-TTL
    • LRU算法 :now-LRU
    • LFU算法:255-LFU
      为什么要进行这样的计算,而不是直接使用数据呢?原因在于:在淘汰池中,我们进行的是升序排列,倒序淘汰的方式进行key的淘汰.(maxTTL-TTL)进行升序排列,相当于TTL进行降序排列;同理now-LRU255-LFU的计算方式也是如此.

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

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

相关文章

论文笔记(五十)Segmentation-driven 6D Object Pose Estimation

Segmentation-driven 6D Object Pose Estimation 文章概括摘要1. 引言2. 相关工作3. 方法3.1 网络架构3.2 分割流3.3 回归流3.4 推理策略 4. 实验4.1 评估 Occluded-LINEMOD4.1.1 与最先进技术的比较4.1.2 不同融合策略的比较4.1.3 与人体姿态方法的比较 4.2 在YCB-Video上的评…

uniapp使用easyinput文本框显示输入的字数和限制的字数

uniapp使用easyinput文本框显示输入的字数和限制的字数 先上效果图&#xff1a; 整体代码如下&#xff1a; <template><view class"nameInfoContent"><uni-easyinput class"uni-mt-5" suffixIcon"checkmarkempty" v-model&quo…

【MyBatis源码】SqlSessionFactoryBuilder源码分析

文章目录 概述类结构从 InputStream 创建 SqlSessionFactoryXMLConfigBuilder构建ConfigurationXMLConfigBuilder初始化方法parse()方法parseConfiguration属性&#xff08;properties&#xff09; 概述 SqlSessionFactory 是 MyBatis 的核心接口之一&#xff0c;提供创建 Sql…

vue通过JSON文件生成WPML文件源码

可以使用封装的json解析器进行JSON数据获取&#xff0c;读取点的经度、维度、高程等数据&#xff0c;再使用对应的WPML文件生成函数使用该源码下载WPML文件&#xff08;固定WPML生成&#xff1a;js模板式生成大疆上云wpml文件&#xff08;含详细注释&#xff0c;已封装成函数&a…

(7) cuda异常处理

文章目录 上节概要异常处理代码 上节概要 上一节 block_width 64的时候&#xff0c;64644096 > 1024&#xff08;一个block里面最多只能有1024个线程&#xff0c;所以这里计算会有问题&#xff09; 异常处理 __FILE__: 编译器内部定义的一个宏。表示的是当前文件的文件…

【C++单调栈 贡献法】907. 子数组的最小值之和|1975

本文涉及的基础知识点 C单调栈 LeetCode907. 子数组的最小值之和 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff0c;因此 返回答案模 109 7 。 示例 1&#x…

项目:Boost 搜索引擎

项目&#xff1a;Boost 搜索引擎 1、项目背景 公司&#xff1a;百度、360、搜狗、谷歌 …站内搜索&#xff1a;搜索的数据更垂直&#xff08;相关&#xff09;&#xff0c;数据量小 2、整体框架 3、技术栈和项目环境 技术栈&#xff1a;C/C C11&#xff0c;STL&#xff0c;jso…

error Unexpected mutation of “xxxxx“ prop

错误是在进行 eslint 检查的时候触发的&#xff0c;这个错误的原因是我们在子组件中改变了父组件传递过来的 props 解决方法一&#xff1a; 不改变父组件传递过来的 props&#xff0c;如果需要改变父组件传递过来的值&#xff0c;可以使用 defineModel() 进行接收值&#xff…

【零售和消费品&软件包】快递包装类型检测系统源码&数据集全套:改进yolo11-HSPAN

改进yolo11-EfficientHead等200全套创新点大全&#xff1a;快递包装类型检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.24 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统…

STM32第15章 RCC-使用HSE/HSI配置时钟

时间:2024.10.21-10.23 参考资料: 《零死角玩转STM32》“RCC-使用HSE/HIS配置时钟”章节 TIPS: 从前面的历程中我们知道,程序在启动的时候会执行汇编文件,汇编文件里会调用System_Init(固件库编程的函数),它里面会把时钟初始化成72M,因此前面我们在用固件库写程序的…

MSR寄存器独有的还是共享的

英特尔白皮书Volume 4: Model-Specific Registers 这一章列出了不同英特尔处理器系列的 MSR&#xff08;模型特定寄存器&#xff09;。所有列出的 MSR 都可以使用 RDMSR 和 WRMSR 指令进行读取和写入。MSR 的作用域定义了访问相同 MSR 的处理器集合&#xff0c;具体如下&#x…

栈和队列(上)-栈

1. 栈的概念 引入: 我们平时拿羽毛球,是从盒子顶部的羽毛球开始拿的,而顶部的元素是我们最后放进去的. 栈: 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后…

温泉押金原路退回系统, 押金+手牌+电子押金单——未来之窗行业应用跨平台架构

一、温泉手牌收押金必要性 1. 防止手牌丢失&#xff1a;手牌是顾客在温泉内存储个人物品和进出更衣室的重要凭证。收押金可以让顾客更加重视手牌&#xff0c;降低丢失的概率。比如说&#xff0c;有的顾客可能会因为粗心大意随手放置手牌&#xff0c;如果没有押金的约束&…

STM32之外部中断(实验对射式传感器计次实验)

外部中断配置 #include "stm32f10x.h" // Device headeruint16_t CountSensor_Count;void CountSensor_Init(void) {//RCC--> GPIO--> AFIO--> EXTI--> NVIC五步RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB时…

图---java---黑马

图 概念 图是由顶点(vertex)和边(edge)组成的数据结构&#xff0c;例如 该图有四个顶点&#xff1a;A&#xff0c;B&#xff0c;C&#xff0c;D以及四条有向边&#xff0c;有向图中&#xff0c;边是单向的。 有向 vs 无向 如果是无向图&#xff0c;那么边是双向的&#x…

aarch64-opencv341交叉编译,并在arm上部署helloopencv

背景 当需要在jetson xavier nx或者rk 3562等平台上开发关于视觉检测的工程时&#xff0c;由于arm板子资源不足或者不能联网等原因&#xff0c;通常在虚拟机上利用交叉编译器编译得到可执行程序&#xff0c;然后部署到arm板上。 aarch64-opencv341交叉编译 ubuntu虚拟机中先…

【Linux】环境下升级redis

一、摘要 最近漏洞扫描服务器发现&#xff0c;Redis 缓冲区溢出漏洞(CVE-2024-31449)&#xff0c;解决办法redis更新到6.2.16、7.2.6或7.4.1及以上版本。 二、漏洞描述 漏洞描述&#xff1a;经过身份验证的用户可能会使用特制的 Lua 脚本来触发位库中的堆栈缓冲区溢出&#…

Kaggle比赛复盘

Kaggle - LLM Prompt Recovery 解决方案报告 比赛背景/目标 大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;通常被用于改写或对文本进行风格修改。本次Kaggle竞赛的目标是根据给定的改写文本&#xff0c;还原用于将原始文本转换为改写文本的LLM…

MetaArena推出《Final Glory》:引领Web3游戏技术新风向

随着区块链技术的日益成熟&#xff0c;Web3游戏成为了游戏产业探索的新方向&#xff0c;将去中心化经济与虚拟世界结合在一起&#xff0c;形成了一个全新的生态体系。然而&#xff0c;尽管Web3游戏展示了令人兴奋的可能性&#xff0c;但其背后的技术障碍依旧严峻&#xff0c;特…