Redis过期处理策略、惰性删除、定期删除、RDB和AOF、内存淘汰机制

news2024/10/2 10:37:53

文章目录

    • 🍊 Redis过期策略
      • 🎉 惰性删除流程
      • 🎉 定期删除流程
    • 🎉 内存淘汰机制
    • 🎉 RDB对过期key的处理
    • 🎉 AOF对过期key的处理

📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。🎥有从0到1的高并发项目经验,利用弹性伸缩、负载均衡、报警任务、自启动脚本,最高压测过200台机器,有着丰富的项目调优经验。

📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

以梦为马,不负韶华

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

CSDN
🔥Redis过期处理策略 🚀惰性删除、定期删除 💡RDB和AOF 🌟内存淘汰机制

🍊 Redis过期策略

Redis采用的过期策略
惰性删除+定期删除

🎉 惰性删除流程

什么是惰性删除呢?让我们来一探究竟。

在Redis中,我们经常会使用到get、setnx等操作。而在进行这些操作之前,Redis会先检查key是否过期。若过期,Redis会将key删除,然后再执行相应的操作;若没过期,Redis会直接执行相应的操作。

这个过程就是惰性删除流程。它为我们的操作提供了很大的便利,因为我们不需要手动去删除过期的key,Redis会自动为我们完成这个任务。

不过,也有可能出现一些问题。比如说,我们可能会误将一个长期不使用的key设定为永久Key,这样就会一直存在内存中。这时候,就需要我们手动去删除这个key。

但是,我们也无需过于担心这个问题。因为Redis有自己的内存管理机制,一旦内存不够用,Redis就会自动将不常用的key删除,以保证内存的充足。

那么,惰性删除流程具体是如何实现的呢?让我们来看一个例子。

假设我们现在有一个key为“test”的键值对,其中value值为“Hello World”。我们设置这个key的过期时间为10秒。当我们进行get操作的时候,Redis会先检查这个key是否过期。如果没有过期,那么Redis就会直接返回value值“Hello World”。但是,如果已经过期了,Redis就会先将这个key删除,然后再返回null值。

那么,这个惰性删除流程对我们有什么好处呢?首先,这个流程可以避免我们手动去删除过期的key,省去了我们很多的时间和精力。其次,惰性删除流程也可以让我们更加高效地利用Redis的存储空间,让Redis的性能更加优化。

当然,也需要注意的是,在进行开发的时候,我们需要根据实际情况来设置key的过期时间。如果我们需要一个长期使用的key,就需要将过期时间设置为0,即为永久Key。而如果我们需要一个临时性的key,就需要将过期时间设置为较短的时间。

总之,惰性删除流程是Redis中非常重要的一个机制,它让我们的操作更加高效、方便。希望本文对大家有所帮助,如果您还有其他问题,欢迎私信给我哦!

🎉 定期删除流程

首先,我们来看看什么是定期删除流程。简单来说,定期删除流程是指在Redis中,对指定数量的数据库进行遍历,随机删除小于等于指定数量的过期key。如果遍历到的库中没有设置过期时间的key,则直接执行下一个库的遍历;如果遍历到的库中有设置过期时间的key,则检查是否过期,如果过期则删除key。定期删除操作会持续执行,直到达到指定时长或者删除的过期key数量达到指定个数时停止。

那么,为什么要进行定期删除呢?因为在Redis中,key是有过期时间的。如果一个key过期了,但是没有被及时删除,那么就会占用宝贵的内存资源,导致Redis内存块耗尽。为避免这种情况发生,我们就要对过期key进行删除。而定期删除流程就是定时清理过期key的一个方法。

那么,定期删除流程是如何实现的呢?我们知道,Redis是一个高性能的内存数据库,那么在内存中,如何选择要删除的过期key呢?这就需要用到算法了。Redis中使用的是一种叫作“惰性删除”的算法。这种算法会在访问key的时候,检查它是否过期。如果过期了,就会被标记为“待删除”,在下一次操作或者定期删除时,才会被真正地删除。这种算法的好处是避免了频繁地遍历和删除key,从而提高了Redis的性能。

不过,有时候定期删除流程也会出现问题。比如说,如果定期删除漏掉了很多过期key,那么会导致内存块耗尽,进而影响Redis的性能和稳定性。这时候,就需要运用到另一种技术——内存淘汰机制。内存淘汰机制会根据一些策略,选择一些key进行删除,从而释放内存空间。常用的策略有:LRU(Least Recently Used,最近最少使用)、LFU(Least Frequently Used,最不经常使用)和Random(随机)等。这些策略分别适用于不同的应用场景。

最后,我们来总结一下定期删除流程的要点。定期删除流程是对过期key进行定时删除的一种方法,使用了惰性删除算法来优化删除效率。如果定期删除漏掉了很多过期key,就需要运用内存淘汰机制来释放内存空间。在实际应用中,应该根据具体的业务需求和数据特点,选择合适的算法和策略来实现定期删除和内存淘汰。

🎉 内存淘汰机制

在内存不足的情况下,Redis会使用一系列的内存淘汰机制来减少内存使用,从而保证系统的稳定性和可用性。这些内存淘汰机制包括noeviction、allkeys-lru、allkeys-random、volatile-lru、volatile-random、volatile-ttl。其中,noeviction虽然不会淘汰数据,但一般很少使用,因为它会导致新写入操作报错。而allkeys-lru和volatile-ttl是常用的内存淘汰机制。

allkeys-lru的工作原理是从键空间中移除最近最少使用的key。它通过检查键空间中的计数器来判断哪些key最近最少使用。例如,某个key的计数器之前已经被访问过多次,但是在最近的一段时间内没有被访问,那么它就是最近最少使用的key,可以被淘汰。这个机制非常适用于缓存场景,因为经常被访问的数据可以保留在内存中,而不常用的数据可以被清除,释放内存。

而volatile-ttl则是在设置了过期时间的键空间中,优先移除过期时间更早的key。它通过检查键空间中的过期时间来判断哪些key需要被淘汰。例如,某个key的过期时间已经过期了,那么它就是过期时间更早的key,优先被淘汰。这个机制非常适用于缓存场景,因为经常被访问的数据可以保留在内存中,而过期了的数据可以被清除,释放内存。

除了allkeys-lru和volatile-ttl之外,还有allkeys-random和volatile-random两个机制。它们的工作原理类似,都是随机移除某个key。但是,在实际应用中,由于没有规律可循,这种机制经常导致内存淘汰后造成性能下降,所以一般情况下不建议使用。

此外,Redis还提供了LFU(Least Frequently Used)和LRU(Least Recently Used)两种常见的内存淘汰机制。LFU是基于梯形数组实现的计数器机制,通过记录每个key被访问的次数来判断哪些key需要被淘汰。而LRU则是基于时间戳实现的机制,通过记录每个key最近被访问的时间戳来判断哪些key需要被淘汰。在实际应用中,LFU和LRU两种机制经常被同时使用,以保证系统的稳定性和可用性。

总之,Redis的内存淘汰机制是非常重要的,可以帮助我们优化系统的内存使用和性能表现。在实际应用中,根据场景和需求选择合适的内存淘汰机制是非常关键的一步。

🎉 RDB对过期key的处理

RDB,全称Redis Database,是Redis的一种持久化机制,它可以把内存中的数据写入到硬盘中,从而保证Redis的数据不会因进程退出或机器故障而丢失。在Redis中,RDB是通过fork一个子进程来进行的,子进程会将当前内存中的数据写入临时文件中,然后替换原来的RDB文件。但是,在进行RDB持久化时,需要注意一个问题,那就是过期key的处理问题。

首先我们需要了解一个概念,就是Redis中的key是有过期时间的,当key的过期时间到达之后,Redis会自动删除该key。但是,如果在进行RDB持久化时,过期key没有进行处理,会导致RDB文件中存在已经过期的key,这样就会浪费存储空间,同时也会影响性能。因此,在进行RDB持久化时,需要对过期key进行处理。

对过期key的处理分为两种情况:在持久化过程中和在恢复数据过程中。

在持久化过程中,Redis会先将内存数据库中的数据写入到一个临时文件中,然后再用该文件替换原来的RDB文件。在进行持久化时,Redis会对每一个key进行过期检查,如果发现该key已经过期,就不会将其写入临时文件中,从而保证生成的RDB文件中不存在已经过期的key。这样可以节省存储空间,同时也可以提高Redis的性能。

举个例子,假设我们有一个key为“test”的数据,在内存数据库中的过期时间为60秒。如果在60秒内,我们进行了RDB持久化操作,则会将该key写入临时文件中。但是,如果在60秒后,我们再次进行RDB持久化操作,则会发现该key已经过期,因此不会将其写入临时文件中。

在恢复数据过程中,Redis会先将RDB文件中的数据读取到内存数据库中,然后再进行数据的处理。在进行数据处理时,Redis会对每一个key进行过期检查,如果发现该key已经过期,就不会将其导入到内存数据库中。这样可以保证恢复的数据都是有效的数据,从而避免出现数据的混乱和错误。

举个例子,假设我们有一个RDB文件,其中包含一个key为“test”的数据,在RDB文件中的过期时间为60秒。如果我们将该RDB文件恢复到内存数据库中,然后在60秒内进行查询操作,则会发现该key是存在的,因为在60秒内,该key还没有过期。但是,如果在60秒后进行查询操作,则会发现该key已经不存在了,因为已经过期了。

需要注意的是,在从RDB文件中恢复数据时,只会忽略已经过期的key,而不会立刻将其删除。只有当进行查询操作时,才会删除已经过期的key,从而保证内存数据库中的数据是准确的。

综上所述,对过期key的处理对于RDB持久化机制来说非常重要。在持久化过程中,需要对已经过期的key进行处理,不写入到RDB文件中;在恢复数据过程中,需要对已经过期的key进行处理,不导入到内存数据库中。这样可以保证RDB文件中的数据都是有效的数据,同时也可以提高Redis的性能。

🎉 AOF对过期key的处理

AOF是指Append-Only File,即追加式文件。它是Redis中的一种持久化方式,用于将Redis中的数据持久化到硬盘上,以便在Redis重启时能够从硬盘读取数据恢复。在Redis中,数据可以被存储在内存中,但是内存中的数据会在Redis重启时丢失,所以需要将数据持久化到硬盘上。

在Redis中,每个key都有一个过期时间,当过期时间到达后,这个key就会被Redis删除。对于AOF来说,过期key并不会影响AOF的持久化。具体来说,对于过期的key,如果它还没有被删除,那么在执行AOF持久化操作时,这个key是不会被写入AOF文件的。因为这个key没有被修改过,所以并不需要将它写入AOF文件中。

但是,当这个已经过期的key被删除时,程序会向AOF文件追加一条del命令。这条del命令表示将来在使用AOF文件来恢复数据时,这个过期的键就会被删除掉。

除了对已经过期的key的处理,AOF还有一个功能就是重写。AOF重写是指将AOF文件中的数据重新写入到另一个文件中,以达到减小AOF文件的大小、提高性能的目的。在AOF重写的过程中,会先判断key是否过期,如果这个key已经过期了,那么就不会被重写到新的AOF文件中。这样做的好处在于可以减小新的AOF文件的大小,提高重写的效率。

举一个例子来说明AOF对过期key的处理。假设我们在Redis中存储了一个键值对,key为"hello",value为"world",过期时间为10秒。在这10秒内,我们执行了一些操作,比如将"hello"的值修改了。此时,在执行AOF持久化操作时,会将这个键值对以及修改操作写入到AOF文件中。但是,在10秒到期后,这个键就会自动被Redis删除。当我们再次执行AOF持久化操作时,由于这个键已经被删除了,所以并不需要将它写入AOF文件中。如果我们在key过期后,手动执行了删除操作,那么这个删除操作就会被写入AOF文件中,以保证在将来使用AOF文件恢复数据时,过期的键会被删除。

总之,AOF对过期key的处理是非常严谨和细致的。在Redis中,过期key并不会影响AOF的持久化,同时AOF重写时也会排除过期的键,以避免浪费磁盘空间和提高重写效率。

CSDN

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD

📥博主的人生感悟和目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本身是一个很普通程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

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

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

相关文章

领导:给你一个项目,如何开展性能测试工作。我:***

01 怎么开展性能测试 01 测试的一般步骤 性能测试的工作是基于系统功能已经完备或者已经趋于完备之上的,在功能还不够完备的情况下没有多大的意义(后期功能完善上会对系统的性能有影响,过早进入性能测试会出现测试结果不准确、浪费测试资源…

react项目实现文件预览,比如PDF、txt、word、Excel、ppt等常见文件(腾讯云cos)

使用腾讯云文档预览&#xff0c;需要开通文档预览功能&#xff0c;该功能需要收费的。 使用限制 如果需要图片预览、视频或音频可以使用获取下载链接。 页面代码 <button onClick() > {handleClick(myself/文档.xlsx)}>预览</button><div style{{ height:…

百度AI代码辅助工具Baidu Comate初体验

国内的程序员们也可以使用国产的代码辅助工具了。百度Comate智能代码助手正式上线SaaS版本&#xff0c;即日起可申请试用。官网&#xff08;https://comate.baidu.com/&#xff09;。 点开使用手册&#xff0c;先瞜一眼&#xff0c;后面再细看&#xff0c;手册里面有详细的说明…

yum管理openssh服务

文章目录 yum工具使用1.yum的配置文件2.yum仓库的管理本地仓库网络仓库 3.使用yum管理软件listcleanrepolistinstallupdatedowngraderemoveinfoprovideshistorydeplistgrouplistgroupinstall opensshsshd服务Secure Shell 示例ssh主机密钥配置免密登录SSH 安全注意事项 yum工具…

【文件操作】Java -操作File对象

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 文件操作 Java - File对象 Java - File对象 Fi…

Matlab绘制散点的95%置信区间图

Matlab常绘制95%置信区间图&#xff0c;主要使用到patch函数。 如果直接使用散点进行拟合&#xff0c;在patch函数绘制95%置信区间时&#xff0c;会绘制的很乱&#xff0c;这个是由于patch函数所导致的&#xff0c;其实这个问题在 Matlab绘制95%置信区间图 中已经讲到过&#…

JS 严格模式和正常模式详解

JavaScript 严格模式&#xff08;Strict Mode&#xff09;和正常模式&#xff08;Non-Strict Mode&#xff09;是用于控制 JavaScript 代码执行的两种不同模式。严格模式引入了一些限制和变化&#xff0c;旨在帮助开发人员编写更可靠、安全和高效的代码。在本文中&#xff0c;我…

js实现将文本生成二维码(腾讯云cos)

示例 页面代码 import { getQCodeUrl } from /utils/cosInstance; import { PageContainer } from ant-design/pro-components; import { Access, useAccess } from umijs/max; import { Button, Image } from antd; import { useState } from react;const AccessPage: Reac…

SpringCloud复习:(2)@LoadBalanced注解的工作原理

LoadBalanced注解标记了一个RestTemplate或WebClient bean使用LoadBalancerClient来进行负载均衡。 LoadBalancerAutoConfiguration类给带注解的RestTemplate添加了拦截器&#xff1a;LoadBalancerInterceptor. 具体流程如下&#xff1a; 首先定义一个LoadBalancerInterceptor…

超强满血不收费的AI绘图教程来了(在线Stable Diffusion一键即用)

超强满血不收费的AI绘图教程来了&#xff08;在线Stable Diffusion一键即用&#xff09; 一、简介1.1 AI绘图1.2 Stable Diffusion1.2.1 原理简述1.2.2 应用流程 二、AI绘图工具2.1 吐司TusiArt2.2 哩布哩布LibLibAI2.3 原生部署 三、一键即用3.1 开箱尝鲜3.2 模型关联3.3 Cont…

小白必看,手把手教你重装系统

一&#xff0c;安装步骤 二&#xff0c;重装之前需要做的准备 1、重装之前请大家务必注意备份重要资料。电脑有价&#xff0c;数据无价——重要数据备份之后&#xff0c;电脑随便折腾都没问题。大不了就是重装不成功。系统软件问题多试几次总能解决的&#xff0c;但重要数据一…

《红蓝攻防对抗实战》七.常规反弹之利用NC在Linux系统执行反弹shell

目录 一.利用NC工具在linux执行反弹shell 1.Linux正向连接shell 2.利用Linux自带bash反弹Shell 前文推荐&#xff1a; 《红蓝攻防对抗实战》一. 隧道穿透技术详解《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网《红蓝攻防对抗实战》三.内网探测协议出网之H…

最新壁纸自动采集系统网站PHP源码/360壁纸官方数据接口采集/ZHEYI采集源码

源码介绍&#xff1a; 最新壁纸自动采集系统网站PHP源码&#xff0c;它是ZHEYI自动采集源码&#xff0c;能够在360壁纸官方数据接口采集。很好用的壁纸网站源码分享&#xff0c;仅供学习&#xff0c;请勿商用。 ZHEYI自动采集壁纸PHP源码&#xff0c;能全自动采集高清壁纸网源…

设计模式—设计模式总览

设计模式—设计模式总览 在 1994 年&#xff0c;由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 《Design Patterns - Elements of Reusable Object-Oriented Software》&#xff08;中文译名&#xff1a;《设计模式 - 可复用的面向对…

Wish如何入驻?最全防封攻略

近日来&#xff0c;跨境电商平台Wish有了新改革&#xff0c;为提高产品质量把控效率&#xff0c;Wish最近将入驻机制又完全开放转变为“邀请制”&#xff0c;加强了品控措施&#xff0c;也意味着商家入驻门槛变高&#xff0c;流程与之前截然不同。但对于已有跨境电商经验/没有跨…

Mybatis 简介(一)

这里使用的是3.5.11版本 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;P…

非连续分配管理方式-基本分页存储管理

非连续分配-可为用户进程分配分散的内存空间 一、存储过程 1.将内存空间分成大小相等的分区&#xff0c;每个分区为一个页框/页帧(内存块/物理块/物理页面)&#xff0c;每个页框有一个编号(页框号/内存块号/物理块号)&#xff0c;从0开始 2.将进程的逻辑地址空间也分为与页框…

在NodeJS中使用npm包实现JS代码混淆加密

使用npm包&#xff0c;在NodeJS中实现JS代码混淆加密 在前后端JS开发过程中&#xff0c;JS代码保护&#xff08;JS代码混淆加密&#xff09;是非常重要的一环。 JShaman是一个云端的代码保护Saas平台&#xff0c;可以对JS代码进行混淆、加密、压缩等操作&#xff0c;从而增强…

[极客大挑战 2019]EasySQL

【解题思路】 1.打开靶机链接 2.输入数据进行尝试 输入1,1&#xff1a; 可以在导航栏里面看到username和password的变量。 3.使用万能密码 username&#xff1a;1 or 11# username&#xff1a;任意数据 password&#xff1a;任意数据 …

传统制造业如何转型?什么是智能工厂?

本文将为大家讲解&#xff1a;传统制造业如何转型&#xff1f;什么是智能工厂&#xff1f; 一、传统工业存在哪些痛点 相较于新兴工业&#xff0c;传统工业在当前发展放缓&#xff0c;并受到了一波互联网数字化智能化发展的冲击。 1、低效率和高成本 传统工业通常采用传统的…