Redis过期清理策略和内存淘汰机制

目录

    • Redis过期清理策略
    • Redis内存淘汰机制

Redis过期清理策略

Redis 通过设置键的过期时间来实现自动删除过期键。当键的过期时间到达时,Redis 会自动将该键删除。Redis 过期清理策略主要有以下两种:

  1. 惰性删除:Redis 在获取键时会检查键是否过期,如果过期则删除。惰性删除可以确保了过期键不会被返回给客户端,但是可能导致内存占用较高,因为不会主动回收过期键的内存空间。在惰性删除策略下,如果过期键一直没有被访问,那么它将永远不会被删除。所以Redis还有下面一种清理策略

  2. 定期删除:当一个key设置了过期时间之后,Redis会将这个key放入一个过期字典中,并设置对应的过期时间。然后,Redis会启动一个定时器,定时检查过期字典是否有过期的key。如果有,Redis会将这个key从数据中删除。这种策略可以保证内存被尽快释放,但在CPU时间紧张的情况下,可能需要花时间去删除这些key

Redis 定时扫描策略

Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是
采用了一种简单的贪心策略。

  1. 从过期字典中随机 20 个 key;
  2. 删除这 20 个 key 中已经过期的 key;
  3. 如果过期的 key 比率超过 1/4,那就重复步骤 1;

同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时
间的上限,默认不会超过 25ms。

Redis内存淘汰机制

当已用内存超过maxmemory限定时,Redis会触发内存淘汰机制。内存淘汰机制包括对设置了过期时间的key进行处理的几种方式,如volatile-ttl(根据过期时间的先后进行删除,越早过期的越先被删除)、volatile-random(随机删除设置了过期时间的键值对)等。

maxmemory配置指定了Redis可以使用的内存,你可以在redis.conf文件进行设置

例如,要配置100兆的内存限制,可以在redis.conf文件中添加以下指令:

maxmemory 100 mb

以下是Redis的内存淘汰机制的几种策略:

  1. noeviction:这是默认策略,当内存不足以容纳新写入数据时,新写入操作会报错,无法写入新数据。
  2. allkeys-random:在所有键中,随机选择并删除数据。
  3. volatile-random:在设置了过期时间的键中,随机选择并删除数据。
  4. volatile-ttl:在设置了过期时间的键中,优先删除剩余生存时间最短的键值对。
  5. allkeys-lru:在所有键中,删除最近最少使用的键。
  6. volatile-lru:在设置了过期时间的键中,删除最近最少使用的键。
  7. allkeys-lfu:在所有键中,删除最不经常使用(访问次数最少)的键。
  8. volatile-lfu:在设置了过期时间的键中,删除最不经常使用访问次数最少)的键。

注:LFU(Least Frequently Used)策略是在Redis 4.0版本开始加入的

内存淘汰策略设置

内存淘汰策略可以通过maxmemory-policy参数进行设置

我们可以打开 Redis 配置文件 redis.conf,在配置文件中找到 maxmemory-policy 参数,根据你的需求,选择一个合适的策略,并将其设置为对应的值。

例如,如果要使用 LFU 策略,可以将 maxmemory-policy 设置为 volatile-lfu 或 allkeys-lfu。

如果我们使用的是lru或者lfu策略,那么还有一个参数需要我们了解,那就是maxmemory-samples 参数

maxmemory-samples 参数用于设置 Redis 在执行 LFU(Least Frequently Used)和 LRU(Least Recently Used)淘汰策略时所使用的样本数目。

LFU 和 LRU 策略都需要通过近期访问记录来判断键的热度。为了减少计算开销,Redis 会对一部分键进行采样,然后根据这些样本来估计键的访问频率或访问时间。maxmemory-samples 参数指定了采样的样本数目。

较小的样本数目可以减少采样的计算开销,但可能导致对键的访问频率或访问时间估计不准确。而较大的样本数目可以提高估计的准确性,但会增加计算开销。

默认情况下,maxmemory-samples 参数的值为 5。你可以根据实际情况进行调整。通常来说,如果 Redis 实例的键数量很大,适当增加 maxmemory-samples 的值可能会更好地捕捉键的热度变化。

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

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

相关文章

《ORANGE’S:一个操作系统的实现》读书笔记(二十七)文件系统(二)

上一篇文章我们记录了如何操作硬盘,并且编写了简单的硬盘驱动程序用于获取一些硬盘的参数。这篇文章就在上一篇文章的基础上记录文件系统,完善硬盘驱动程序。 文件系统 现在我们该仔细考虑如何构建一个文件系统了。这并不是我们第一次接触文件系统&…

python 工作目录 与 脚本所在目录不一致

工作目录:执行脚本的地方 我以为工作目录会是当前执行脚本的目录位置,但其实不是,例如: 图中红色文件为我执行的脚本文件,但是实际的工作目录是PYTHON LEARNING 可以用如下代码查询当前工作目录: import os…

dubbo的springboot集成

1.什么是dubbo? Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo …

【三】把Python Tk GUI打包exe可执行程序,移植到其他机器可用

背景 这是一个系列文章。上一篇【【二】为Python Tk GUI窗口添加一些组件和绑定一些组件事件-CSDN博客】 使用python脚本写一个小工具。因为命令行运行的使用会有dos窗口,交互也不是很方便,开发环境运行也不方便分享给别人用,所以想到…

免费API接口:让开发更简单更快

运营商三要素 API:输入姓名、身份证号码、手机号码,验证此三种信息是否一致,返回验证结果、手机归属地、运营商名称。银行卡三要素:检测输入的姓名、身份证号码、银行卡号是否一致。毫秒级响应、直联保障,支持全国所有…

ubantu中的docker安装

1.Ubuntu Docker 安装 | 菜鸟教程 (runoob.com) 我就是看这个教程进行操作的 2.执行下面两步,就算是安装完成了 3.启动,并检查是否安装成功: 4.安装之后,怎么用,那就是自己随便探索咯,可以看博客&#xf…

Ubuntu and Mac OSX之间传输文件(共享文件夹方法)

解决思路来自于:https://devicetests.com/share-files-ubuntu-mac-osx 利用了samba协议,原文: Samba is an open-source software suite that uses the SMB/CIFS protocol to provide seamless file and print services to SMB/CIFS client…

3D Web可视化开发工具包HOOPS Communicator:提供Web端浏览大型模型新方案!

前言:HOOPS Communicator是Tech Soft 3D旗下的主流产品之一,具有强大的、专用的高性能图形内核,专注于基于Web的高级3D工程应用程序。其由HOOPS Server和HOOPS Web Viewer两大部分组成,提供了HOOPS Convertrer、Data Authoring的模…

【Spring Cloud】Gateway组件的三种使用方式

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 &am…

游戏版 ChatGPT,要用 AI 角色完善生成工具实现 NPC 自由

微软与 AI 初创公司 Inworld 合作,推出基于 AI 的角色引擎和 Copilot 助理,旨在提升游戏中 NPC 的交互力和生命力,提升游戏体验。Inworld 致力于打造拥有灵魂的 NPC,通过生成式 AI 驱动 NPC 行为,使其动态响应玩家操作…

噪声数据库

原文不能收藏,转发,就写这里了:语音行业有什么好用的开源噪声库吗? Audio research group - Tampere University - Datasets 这里面很多,下载比较麻烦点,需要找需要的 2. http://www.cs.tut.fi/sgn/arg/d…

蜗牛目标检测数据集VOC格式480张

蜗牛,一种缓慢而坚韧的软体动物,以其螺旋形的外壳和黏附力极强的黏液而为人所熟知。 蜗牛体型呈螺旋形,有一个硬壳保护其柔软的身体。壳的形状和纹理因种类而异,有的光滑如玻璃,有的则布满细纹。蜗牛的头部有两对触角…

现代 C++ 及 C++ 的演变

C 活跃在程序设计领域。该语言写入了许多新项目,而且据 TIOBE 排行榜数据显示,C 的受欢迎度和使用率位居第 4,仅次于 Python、Java 和 C。 尽管 C 在过去二十年里的 TIOBE 排名都位居前列(2008 年 2 月排在第 5 名,到…

el-table实现多行合并的效果,并可编辑单元格

背景 数据为数组包对象&#xff0c;对象里面有属性值是数组&#xff1b;无需处理数据&#xff0c;直接使用el-table包el-table的方法&#xff0c;通过修改el-table的样式直接实现多行合并的效果 html代码 <template><div><el-table size"mini" :d…

【Cadence】sprobe的使用

实验目的&#xff1a;通过sprobe测试电路中某个节点的阻抗 这里通过sprobe测试输入阻抗&#xff0c;可以通过port来验证 设置如下&#xff1a; 说明&#xff1a;Z1代表sprobe往left看&#xff0c;Z2代表sprobe往right看 结果如下&#xff1a; 可以看到ZM1I0.Z2 顺便给出了I…

基于GPT4+Python近红外光谱数据分析及机器学习与深度学习建模

详情点击链接&#xff1a;基于ChatGPT4Python近红外光谱数据分析及机器学习与深度学习建模教程 第一&#xff1a;GPT4基础 1、ChatGPT概述&#xff08;GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变&#xff09; 2、ChatGPT对话初体验&#xff08;注册与充值、购买方法&am…

酒店客房管理系统设计与实现(代码+数据库+文档)

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目 希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一、研究背景 1.1 研究背景 当…

N9914A FieldFox 手持式射频分析仪,6.5 GHz

N9914A FieldFox 手持式射频分析仪 简述&#xff1a; Keysight FieldFox 便携式分析仪可以在非常恶劣的工作环境中&#xff0c;轻松完成从日常维护到深入故障诊断的各项工作。 选择最适合您需求且有强大软件支持的 Keysight FieldFox 配置。 FieldFox 分析仪可配置为电缆与天线…

C语言中的指针变量p,特殊表达式p[0] ,(*p)[0],(px+3)[2] ,(*px)[3]化简方法

一.已知以下代码&#xff0c;请问以下 式子p[0] &#xff0c;p[1] &#xff0c;(*p)[0] &#xff0c;(*p)[1] 是什么意思&#xff1f; int A[3] {1,2,3}; int (*p)[3] &A; 因为前面的嵌入式C语言基础的章节中说过&#xff0c;数组下标其实就是数组首元素的地址往上偏…

前端面试题集合三(js)

目录 1. 介绍 js 的基本数据类型。2. JavaScript 有几种类型的值&#xff1f;你能画一下他们的内存图吗&#xff1f;3. 什么是堆&#xff1f;什么是栈&#xff1f;它们之间有什么区别和联系&#xff1f;4. 内部属性 [[Class]] 是什么&#xff1f;5. 介绍 js 有哪些内置对象&am…