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

本文主要是介绍Redis过期处理策略、惰性删除、定期删除、RDB和AOF、内存淘汰机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

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

这篇关于Redis过期处理策略、惰性删除、定期删除、RDB和AOF、内存淘汰机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/280060

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,