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

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

mac安装redis全过程

《mac安装redis全过程》文章内容主要介绍了如何从官网下载指定版本的Redis,以及如何在自定义目录下安装和启动Redis,还提到了如何修改Redis的密码和配置文件,以及使用RedisInsig... 目录MAC安装Redis安装启动redis 配置redis 常用命令总结mac安装redis官网下

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求