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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 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重写时也会排除过期的键,以避免浪费磁盘空间和提高重写效率。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
239 16
|
15天前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
35 7
|
1月前
|
NoSQL 算法 Redis
redis内存淘汰策略
Redis支持8种内存淘汰策略,包括noeviction、volatile-ttl、allkeys-random、volatile-random、allkeys-lru、volatile-lru、allkeys-lfu和volatile-lfu。这些策略分别针对所有键或仅设置TTL的键,采用随机、LRU(最近最久未使用)或LFU(最少频率使用)等算法进行淘汰。
52 5
|
1月前
|
NoSQL 安全 Redis
redis持久化策略
Redis 提供了两种主要的持久化策略:RDB(Redis DataBase)和AOF(Append Only File)。RDB通过定期快照将内存数据保存为二进制文件,适用于快速备份与恢复,但可能因定期保存导致数据丢失。AOF则通过记录所有写操作来确保数据安全性,适合频繁写入场景,但文件较大且恢复速度较慢。两者结合使用可增强数据持久性和恢复能力,同时Redis还支持复制功能提升数据可用性和容错性。
63 5
|
2月前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
62 11
|
2月前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
81 10
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
515 1
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
29 3