redis的key过期删除策略和内存淘汰机制

一、key的过期删除策略

        原由:一般情况下,在使用redis作缓存,对k设置过期时间,当过期时间到后,k还是占用内存的,并没有从内存中移除。

1.定时删除

        在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

        优点:保证内存被尽快释放

        缺点:1>若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key。

                  2>定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重

2.惰性删除

        key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。

        优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步.

        缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)

3.定期删除

        每隔一段时间执行一次删除过期key操作

        定期任务(serverCron)任务每隔一段时间就会运行一次,其中就包含清理过期key的任务,运行频率由配置文件中的hz参数来控制,取值范围1~500,默认是10,代表每秒运行10次。清理过程如下:

  1. 遍历所有的db
  2. 从db中设置了过期时间的key的集合中随机检查20个key
  3. 删除检查中发现的所有过期key

        如果检查结果中25%以上的key已过期,则继续重复执行步骤2-3,否则继续遍历下一个db,调大hz将会提高redis定期任务的执行频率,如果你的redis中包含很多过期key的话,可以考虑将这个值调大,但要注意同时也会增加CPU的压力,redis作者建议这个值不要超过100。

        优点: 1>通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点.

                 2>定期删除过期key--处理"惰性删除"的缺点

        缺点:1>在内存友好方面,不如"定时删除"

                  2>在CPU时间友好方面,不如"惰性删除"

redis是怎么采用的过期策略

  1. 惰性删除+定期删除
  2. 惰性删除流程:在进行get或setnx等操作时,先检查key是否过期,若过期,删除key,然后执行相应操作;若没过期,直接执行相应操作
  3. 定期删除流程:遍历每个数据库,检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体时下边的描述),如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历,随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key,判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

二、内存淘汰机制

1. 不进行数据淘汰(No Eviction)

  • noeviction:
    • 行为: 这是 Redis 的默认策略。当内存达到上限时,Redis 不会主动淘汰任何数据。
    • 结果: 如果此时有写入请求(如 SETLPUSH 等),Redis 会返回错误(通常是 (error) OOM command not allowed when used memory > 'maxmemory')。读取请求(如 GET)仍然可以正常执行。
    • 适用场景: 适用于数据量小且能精确控制内存,或者绝对不允许丢失任何数据的场景。需要应用程序自己处理内存溢出错误。

2. 基于过期时间的淘汰策略(针对设置了 expire 的 Key)

这些策略只会在设置了过期时间(TTL)的键中选择淘汰目标。

  • volatile-lru:

    • 行为: 从设置了过期时间的键中,使用最近最少使用(Least Recently Used, LRU)算法淘汰最久未被访问的键。
    • 特点: 优先保证长期未访问的过期数据被淘汰,保留了经常访问的热点过期数据。
    • 适用场景: 缓存场景,其中大部分需要缓存的数据都设置了过期时间,希望保留热点数据。
  • volatile-lfu:

    • 行为: 从设置了过期时间的键中,使用最少频率使用(Least Frequently Used, LFU)算法淘汰访问频率最低的键。
    • 特点: LFU 算法比 LRU 更能反映数据的长期访问热度,能更好地保留高频访问的数据,即使它们最近一次访问不是最新的。
    • 适用场景: 缓存场景,数据访问模式存在明显的热点,且希望更精确地保留高频访问的过期数据。需要 Redis 4.0+。
  • volatile-ttl:

    • 行为: 从设置了过期时间的键中,淘汰剩余生存时间(TTL)最短的键。
    • 特点: 优先淘汰即将过期的数据。
    • 适用场景: 当希望数据尽可能在过期前被使用,但内存紧张时优先清理“快过期”的数据。效果可能不如 volatile-lru 或 volatile-lfu 理想。
  • volatile-random:

    • 行为: 从设置了过期时间的键中,随机选择一个键进行淘汰。
    • 特点: 实现简单,性能开销小,但淘汰没有基于访问模式,可能淘汰掉热点数据。
    • 适用场景: 对淘汰算法要求不高,或者访问模式非常随机,且所有过期键价值相当的场景。

3. 基于所有键的淘汰策略(针对所有 Key,无论是否设置过期时间)

这些策略会考虑数据库中的所有键(无论是否设置了过期时间)。

  • allkeys-lru:

    • 行为: 在所有键中,使用最近最少使用(LRU)算法淘汰最久未被访问的键。
    • 特点: 会淘汰长期未访问的任何数据,包括没有设置过期时间的持久化数据。
    • 适用场景: 缓存场景,其中部分数据可能未设置过期时间,但仍希望基于访问热度进行淘汰。这是非常常用的缓存策略。
  • allkeys-lfu:

    • 行为: 在所有键中,使用最少频率使用(LFU)算法淘汰访问频率最低的键。
    • 特点: 同样能更好地保留高频访问的任何数据。
    • 适用场景: 缓存场景,数据访问热点明显,希望最精确地保留高频访问数据,无论其是否过期。需要 Redis 4.0+。
  • allkeys-random:

    • 行为: 在所有键中,随机选择一个键进行淘汰。
    • 特点: 实现简单,性能开销最小,但完全不考虑访问模式,可能淘汰掉重要的持久化数据。
    • 适用场景: 数据价值相对均匀,或者对数据丢失不敏感,追求极致性能的场景。

三、其他模块对过期键的处理

生成RDB文件时

  1. 执行 save 或 bgsave 时 ,数据库键空间中的过期键不会被保存在RDB文件中。

载入RDB文件时

  1. master 载入RDB时,文件中的未过期的键会被正常载入,过期键则会被忽略。
  2. slave 载入 RDB 时,文件中的所有键都会被载入,当同步进行时,会和Master 保持一致。

AOF 文件写入时

  1. 数据库键空间的过期键的过期但并未被删除释放的状态会被正常记录到AOF文件中,当过期键发生释放删除时,DEL也会被同步到 AOF文件中去。

主从同步过期key

  1. Master 删除过期key之后,会向所有slave 服务器发送一个DEL命令,从服务器收到之后,会删除这些Key。
  2. Slave 在被动的读取过期键时,不会做出操作,而是继续返回该键,只有当Master 发送 DEL 通知来,才会删除过期键,这是统一、中心化的键删除策略,保证主从服务器的数据一致性。

 推荐一个非常好用的工具集合:在线工具集合 - 您的开发助手

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

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

相关文章

NVIDIA Nsight Deep Learning Designer使用

一、关于产品 1.1 产品介绍 NVIDIA Nsight Deep Learning Designer 是一款面向 AI 推理开发者的可视化建模与优化工具。它支持基于 ONNX 格式的神经网络模型编辑、结构可视化、性能分析与 TensorRT 引擎导出,帮助用户更高效地设计、调优和部署高性能推理模型。该工…

Android 常见100道面试题(完整版)

一、基础组件与核心原理Activity 相关Q1:请描述 Activity 的完整生命周期,从创建到销毁经历哪些关键方法?A:Activity 完整生命周期包括:onCreate(初始化)→ onStart(可见&#xff09…

Navicat 为 SQLite 数据库设置密码指南

Navicat 为 SQLite 数据库设置密码指南 在 SQLite 中设置密码实际上是通过加密实现的,Navicat 使用 SQLCipher 扩展来提供数据库加密功能。以下是详细的操作方法和注意事项: 在 Navicat 中设置密码(加密数据库) 步骤 1&#xff1a…

Spring Framework:Java 开发的基石与 Spring 生态的起点

在 Java 技术领域,Spring Framework 无疑是一座里程碑式的存在。它不仅彻底改变了 Java 企业级应用的开发模式,更以其为核心衍生出了庞大的 Spring 生态系统,成为无数开发者构建应用的首选技术栈。本文将以 Spring Framework 为核心&#xff…

Unity中 terriaria草,在摄像机拉远的时候就看不见了,该怎么解决

在 Unity 中,当摄像机拉远时草就看不见,可能是由于地形细节距离设置、摄像机裁剪平面设置或 LOD(Level of Detail)设置不当导致的。以下是具体的解决方法:调整地形细节距离:选中场景中的地形对象&#xff0…

驱动开发系列63 - 编译 NVIDIA 的 open-gpu-kernel-modules 开源内核驱动及搭建调试环境

目录 一:通过apt方式安装nvidia 驱动 二:通过 .run 方式安装nvidia驱动 三:编译安装nvidia开源内核驱动 四:验证和调试 五:卸载驱动 1. 以apt方式安装nvidia 驱动的卸载方法 2. 以.run方式安装nvidia驱动的卸载方法 六:安装CUDA环境 一:通过apt方式安装nvidia 驱动…

Rocky Linux 9.2:从 /home 分区释放 10G 空间扩容到 / 根分区

在日常运维中,常见的问题之一就是安装的软件过多,导致根分区(/)空间不足,而其他分区(例如 /home)却有大量闲置空间。本文将演示如何在 Rocky Linux 9.2 上,通过 LVM(Logi…

iis/iis express无需手动配置handlers,仅将 DLL 放入bin目录即可处理 HTTP 请求的功能

以下是使用VB.NET实现的方案,分别针对传统ASP.NET(System.Web)和ASP.NET Core 两种环境,实现无需手动配置handlers,仅将 DLL 放入bin目录即可处理 HTTP 请求的功能。 一、传统ASP.NET(System.Web&#xff…

【DP】单词的划分

题目描述 有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。 输入 第一行&#xff0c…

UniApp 中使用 tui-xecharts插件(或类似图表库如 uCharts)

要在 UniApp 中使用 tui-xecharts插件(或类似图表库如 uCharts),需遵循以下步骤。以下流程以 ​​uCharts​​(官方推荐的高性能跨平台图表库)为例,因其在 UniApp 生态中更成熟且文档完善。若需使用 tui-xe…

顺序表 —— OJ题

在上一篇文章中简单介绍了顺序表,这一篇文章讲解下一个比较经典的题:杨辉三角先看一下什么是杨辉三角下面解释:大概就是这个规律。而 ta 其实就是二维数组 即:0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1然后看一下这个题的要求…

基于单片机的防酒驾系统设计

一、引言1.1 研究背景与意义随着社会经济的快速发展,汽车保有量持续攀升,道路交通安全问题愈发凸显。酒后驾驶作为交通事故的主要诱因之一,严重威胁着人们的生命财产安全。据统计,全球每年因酒驾造成的交通事故死亡人数高达数十万…

Redis面试精讲 Day 22:Redis布隆过滤器应用场景

【Redis面试精讲 Day 22】Redis布隆过滤器应用场景 在高并发、大数据量的互联网系统中,如何高效判断一个元素是否存在于集合中,是缓存设计中的关键问题。尤其是在面对缓存穿透——即恶意或无效请求频繁查询不存在的数据,导致数据库压力剧增—…

Spark Shuffle中的数据结构

文章目录1.Shuffle中的三种数据结构2.AppendOnlyMap原理2.1 聚合2.2 扩容2.3 排序2.4 为什么是数组?3.ExternalAppendOnlyMap原理3.1 工作原理3.2 AppendOnlyMap大小估计3.2.1 为什么要估计大小?3.2.2 估计大小浅析3.2.2.1 什么时候采样?3.2.…

告别在线转换风险:本地运行的PDF转Word技术评测

Word文档(.docx)是可编辑的主流办公格式,支持灵活修改文字、排版、图片、表格等。它的体积仅有5.5M,小巧不占空间,且转换不限文件大小,随用随转,毫无限制。初次使用需完成一次安装,之…

整体设计 符号学与诠释学融合的整体设计框架(本篇暂时命名)--PromptPilot (助手)答问之1

说明 本系列篇(分多篇)是就前面 已经和腾讯元宝就“整体设计”的讨论内容 再和 PromptPilot (助手)的再次沟通。但内容做了部分修正一边 更准确和完整。摘要(CSDN的AI助手提取的)符号学与诠释学融合的整体设…

Font shape `TU/ptm/m/n‘ undefined(Font) using `TU/lmr/m/n‘ instead

一、警告内容 这是 LaTeX 字体选择机制输出的信息。我们可以把 TU/ptm/m/n 分解来看: TU → 编码 (font encoding) TU 表示 Unicode TeX encoding,即新版 XeLaTeX/LuaLaTeX 下的 Unicode 字体编码。 ptm → 字体族 (family) ptm 代表 Times 字体 (PostS…

拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用

拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用 今天给大家介绍一个封装完善的CAN卡类。 背景 在面对常规开发场景,开发者对复杂SDK进行封装和测试。阅读相关开发资料和理解SDK的DEMO程序。 开篇 如果你也有同样的烦恼,那就来看看今…

机器学习相关算法:回溯算法 贪心算法 回归算法(线性回归) 算法超参数 多项式时间 朴素贝叶斯分类算法

整理了一张“机器学习相关算法与概念速览表”,既包含定义,也配上了容易记住的例子,让大家一眼就能抓住它们的特点: 🤖 机器学习与相关算法&概念 名称定义生动例子典型应用场景回溯算法通过不断尝试和回退来寻找问…

vue+微信小程序 五角星

说明&#xff1a;这个是先画出一个72度菱形&#xff0c;长中长线和短中长线按照一定比例&#xff0c;然后把菱形分层十份&#xff0c;最后再把菱形进行旋转形成五角星&#xff0c;最后显示标签&#xff0c;因为一直对不上所以对标签做了点操作 <template><view class&…