【Redis】Redis 内存淘汰策略

news2024/11/23 8:13:39

文章目录

    • 概述
    • 数据淘汰策略
        • 不进行数据淘汰策略
        • 进行数据淘汰策略
          • 在设置了过期时间的数据中进行淘汰
          • 在所有数据范围内进行淘汰
    • 查看与配置数据淘汰机制
        • 查看 Redis 的数据淘汰机制
        • 修改 Redis 的数据淘汰机制
          • 方法一
          • 方法二
    • 浅谈 LRU 算法和 LFU 算法
      • LRU 算法
      • LFU 算法

概述

当我们往 Redis 中设置键值对时,有一些键值对会给过期时间,而有一些却不会给,而当设置的键值对的数据超过了给 Redis 设置的最大内存,Redis 就该对这些数据做出淘汰删除数据操作。
在 Redis4.0 之前有六种淘汰机制,Redis4.0 后又加了两种淘汰机制,这八种淘汰机制可分为不进行数据淘汰策略机制和进行数据淘汰策略机制。



数据淘汰策略


不进行数据淘汰策略

  • noeviction: 它是Redis3.0 之后,默认的内存淘汰策略,它表示当运行内存超过最大设置内存时,不淘汰任何数据,这时如果有新的数据写入,则会触发 OOM,但是如果没用数据写入的话,只是单纯的查询或者删除操作的话,还是可以正常工作;

进行数据淘汰策略

在设置了过期时间的数据中进行淘汰
  • volatile-random: 随机淘汰设置了过期时间的任意键值;
  • volatile-ttl: 优先淘汰更早过期的键值;
  • volatile-lru: 它是Redis3.0 之前,默认的内存淘汰策略,淘汰所有设置了过期时间的键值中,最久未使用的键值;
  • volatile-lfu: Redis 4.0 后新增的内存淘汰策略,淘汰所有设置了过期时间的键值中,最少使用的键值;
在所有数据范围内进行淘汰
  • allkeys-random: 随机淘汰任意键值;
  • allkeys-lru: 淘汰整个键值中最久未使用的键值;
  • allkeys-lfu Redis 4.0 后新增的内存淘汰策略,淘汰整个键值中最少使用的键值;


查看与配置数据淘汰机制


查看 Redis 的数据淘汰机制

在 Redis 中使用命令就可以查看,命令如下

config get maxmemory-policy

在这里插入图片描述
通过命令就能看到目前使用的是 noeviction 淘汰机制,这个机制是 Redis3.0 之后默认的机制。


修改 Redis 的数据淘汰机制

方法一

通过 config set maxmemory-policy <策略> 命令设置,它的优点是设置之后立即生效,不需要重启 Redis 服务,缺点是重启 Redis 之后,设置就会失效。

方法二

通过修改 Redis 配置文件修改,设置 maxmemory-policy <策略>,它的优点是重启 Redis 服务后配置不会丢失,缺点是必须重启 Redis 服务,设置才能生效。

在这里插入图片描述



浅谈 LRU 算法和 LFU 算法

LRU 算法

传统 LRU 算法的实现是基于链表结构,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要内存淘汰时,只需要删除链表尾部的元素即可,因为链表尾部的元素就代表最久未被使用的元素,这种算法会带来两个问题:

  1. 需要用链表管理所有的缓存数据,这会带来额外的空间开销;
  2. 当有数据被访问时,需要在链表上把该数据移动到头端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低缓存性能,因为都把时间放在链表移动上了;

而 Redis 的 LRU 算法实现的是一种近似 LRU 算法,目的是为了更好的节约内存,它的实现方式是在 Redis 的对象结构体中添加一个额外的字段,用于记录此数据的最后一次访问时间,当 Redis 进行内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 个值(此值可配置),然后淘汰最久没有使用的那个,这种方法带来的优点有两个:

  1. 不用为所有的数据维护一个大链表,节省了空间占用;
  2. 不用在每次数据访问时都移动链表项,提升了缓存的性能;

但是缺点也有,就是无法解决缓存污染问题,比如应用一次读取了大量的数据,而这些数据只会被读取这一次,那么这些数据会留存在 Redis 缓存中很长一段时间,造成缓存污染。


LFU 算法

LFU 算法是根据数据访问次数来淘汰数据的,它的核心思想是如果数据过去被访问多次,那么将来被访问的频率也更高
所以, LFU 算法会记录每个数据的访问次数。当一个数据被再次访问时,就会增加该数据的访问次数。这样就解决了偶尔被访问一次之后,数据留存在缓存中很长一段时间的问题,相比于 LRU 算法也更合理一些。
在 LRU 算法中,Redis 对象头中,会有 24 bits 的 lru 字段用来记录 key 的访问时间戳,因此在 LRU 模式下,Redis 可以根据对象头中的 lru 字段记录的值,来比较最后一次 key 的访问时间长,从而淘汰最久未被使用的 key。
在 LFU 算法中,Redis对象头的 24 bits 的 lru 字段 被分成两段来存储:

  • 高 16bit 存储 ldt(Last Decrement Time),用于记录 key 的访问时间戳;
  • 低 8bit 存储 logc(Logistic Counter),用于记录 key 的访问频次,每个新加入的 key 的 logc 初始值为 5;

在这里插入图片描述

注意,logc 并不是单纯的访问次数,而是访问频次(访问频率),因为 logc 会随时间推移而衰减的。
在每次 key 被访问时,会先对 logc 做一个衰减操作,衰减的值跟前后访问时间的差距有关系,如果上一次访问的时间与这一次访问的时间差距很大,那么衰减的值就越大,这样实现的 LFU 算法是根据访问频率来淘汰数据的,而不只是访问次数。访问频率需要考虑 key 的访问是多长时间段内发生的。key 的先前访问距离当前时间越长,那么这个 key 的访问频率相应地也就会降低,这样被淘汰的概率也会更大。
对 logc 做完衰减操作后,就开始对 logc 进行增加操作,增加操作并不是单纯的 + 1,而是根据概率增加,如果 logc 越大的 key,它的 logc 就越难再增加。
所以,Redis 在访问 key 时,对于 logc 是这样变化的:

  1. 先按照上次访问距离当前的时长,来对 logc 进行衰减;
  2. 然后,再按照一定概率增加 logc 的值;

redis.conf 提供了两个配置项,用于 调整 LFU 算法从而控制 logc 的增长和衰减:

  • lfu-decay-time: 用于调整 logc 的衰减速度,它是一个以分钟为单位的数值,默认值为1,lfu-decay-time 值越大,衰减越慢;
  • lfu-log-factor: 用于调整 logc 的增长速度,lfu-log-factor 值越大,logc 增长越慢;




End


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

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

相关文章

勒索病毒防御 运维安全管控 | 某烟草公司数据安全建设实践

对于烟草行业而言&#xff0c;加快数字化转型是建设现代化烟草经济体系、实现高质量发展的重要支撑。但新技术的普及与应用&#xff0c;在给烟草行业带来便利、创造价值的同时&#xff0c;也使行业面临的数据安全威胁与日俱增。 在数据安全监管合规持续升级的大背景下&#xff…

《自己动手写CPU》学习记录(9)——第7章/Part 2

目录 引言 致谢 流水线暂停 指令说明 madd、maddu、msub、msubu 设计 宏定义文件 程序计数器模块 译码模块 执行模块 访存模块 HI LO 寄存器模块 通用寄存器模块 流水线控制模块 程序ROM MIPS32顶层 MIPS32 SOPC 仿真 仿真程序 TESTBENCH 仿真结果 引言 …

从 0 到 1 搞一个 Compose Desktop 版本的玩天气之绘制

从 0 到 1 搞一个 Compose Desktop 版本的玩天气之绘制 上一篇文章 “从 0 到 1 搞一个 Compose Desktop 版本的玩天气之踩坑” 中大概说了下刚开始使用 Compose Desktop 会遇到的一些问题&#xff0c;帮大家踩了踩坑&#xff0c;那么这一篇则会带大家一起来看下项目中绘制的一…

网易开发三年,现跳槽蚂蚁花呗,4面顺利通过,拿下Java岗offer

面试准备 不论是校招还是社招都避免不了各种面试、笔试&#xff0c;如何去准备这些东西就显得格外重要。 运筹帷幄之后&#xff0c;决胜千里之外&#xff01;不打毫无准备的仗&#xff0c;我觉得大家可以先从下面几个方面来准备面试&#xff1a; 1. 自我介绍。&#xff08;介…

ubuntu22.04LTS 内核源码编译,安装,卸载

下载内核源码 到网站 https://www.kernel.org/ 下载你自己版本的内核源码。 使用如下命令查看自己的内核版本 uname -r编译前准备 安装工具 sudo apt-get install libncurses5-dev libssl-dev build-essential openssl zlibc minizip libidn11-dev libidn11 libelf-dev bc…

困扰程序员50年的问题终于解决了,但好像又没完全解决......

闰秒&#xff0c;这个唯一能够让Meta、谷歌、微软等巨头同暴躁的Linux之父Linus Torvalds达成一致的存在&#xff0c;这个让无数程序员为之头疼的存在&#xff0c;终于要取消了&#xff01; 今年第27届国际计量大会上&#xff0c;与会代表通过了一项决议——从2035年起暂停在官…

【车辆计数】光流法行驶车辆检测计数【含Matlab源码 627期】

⛄一、光流场简介 1 案例背景 运动视觉研究的内容是如何从变化场景中的一系列不同时刻的图像中提取有关场景中物体的形状、位置和运动的信息。根据研究的方法&#xff0c;它可以分为两类&#xff1a;基于特征的方法和基于光流场的方法。基于特征的方法抽取特征点&#xff0c;是…

动态磨砂玻璃渐变背景

网页特效代码合集 动态磨砂玻璃渐变背景 妙用滤镜构建高级感拉满的磨砂玻璃渐变背景 一个磨砂&#xff08;毛玻璃&#xff09;质感效果的渐变背景图&#xff0c;看上去是比较高级的。 这个效果使用 CSS 其实也可以非常轻松制作出来。本文就讨论讨论&#xff1a; 使用 CSS …

WIN10环境下 MYSQL免安装版配置

之前用的旧版本Mysql&#xff0c;还安装Workbench,感觉很冗余&#xff0c;卸了重装一个免安装版&#xff0c; 1、 MYSQL下载解压 MySQL官网下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 点击Download下载免安装版&#xff0c;并进行解压 2、配置环…

02.Ioc容器加载过程-Bean的生命周期源码深度剖析

Spring源码编译教程 Spring IoC容器的加载过程 1.实例化化容器&#xff1a;AnnotationConfigApplicationContext &#xff1a; // 加载spring上下文 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(MainConfig.class);AnnotationConfi…

24岁程序媛实现了人生第一个小目标 | 2022年终总结

前言 大家好&#xff0c;我是伊人a。2022这一年我实现了人生中的第一个小目标-25岁前能够全款拿下宝马3系。耶比耶比&#x1f389;&#x1f389;&#x1f389; 2022年我是一个满眼星辰的的攀登者。 满眼星辰指的是我对未来充满希望且笃定不移&#xff0c; 攀登者指的是我在…

策略模式(State)

参考&#xff1a; 策略设计模式 (refactoringguru.cn) [5. 策略模式 — Graphic Design Patterns (design-patterns.readthedocs.io)](https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/state.html) [design-patterns-cpp/Strategy.cpp at master …

[附源码]Node.js计算机毕业设计高校教务管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

从零开始搭建Vue3.0项目

从零开始搭建Vue3.0项目所使用的软件及工具&#xff0c;环境1.确保本机已安装nodejs和npm2.Vue-cli项目搭建所使用的软件及工具&#xff0c;环境 软件vscode&#xff1a; vscode地址下载&#xff0c; svn集中式管理&#xff1a; 是一个开源的代码版本控制系统&#xff0c;用于…

谷歌PR权重是什么意思?如何查询网站的谷歌PR权重

谷歌PR权重是什么意思&#xff1f; Google权重是SEO中的一个常见名词&#xff0c;谷歌权重最早的概念指的是GooglePageRank&#xff0c;简称谷歌的PR值&#xff0c;由网站的外链数据计算得出。 PR值的出现&#xff0c;导致很多人只注重做外链&#xff0c;忽略了网站自身…

认识文件、文件路径、File类

认识文件、文件路径、File类一、认识文件1.1 狭义与广义1.2 树型结构组织和目录1.3 其他相关知识二、文件路径 (Path)三、File类3.1 构造方法3.2 文件元信息操作方法3.3 代码示例一、认识文件 1.1 狭义与广义 狭义的文件&#xff1a; 存储在硬盘上的数据&#xff0c;以"…

DBSyncer

DBSyncer是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务&#xff0c;提供监控全量和增量数据统计图、应用性能预警等。 特点 组合驱动&#xff0c;自定义…

Git——Windows平台创建github私有仓库详解

目录 1. 注册github&#xff0c;登录 1.1 注册 1.2 登录 2. 创建仓库 3. GitBash使用 3.1 UI界面下载 3.2 配置本地 3.3 配置github 4. 托管 1. 注册github&#xff0c;登录 官网 GitHub 1.1 注册 1.2 登录 2. 创建仓库 根据需要选择&#xff1a; 3. GitBash使用 3…

【从零开始学习深度学习】24.神经网络中池化层的作用:最大池化与平均池化

在之前二维卷积层介绍的图像物体边缘检测应用中&#xff0c;我们构造卷积核从而精确地找到了像素变化的位置。设任意二维数组X的i行j列的元素为X[i, j]。如果我们构造的卷积核输出Y[i, j]1&#xff0c;那么说明输入中X[i, j]和X[i, j1]数值不一样。这可能意味着物体边缘通过这两…

[附源码]计算机毕业设计的网上点餐系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…