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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
相关文章
|
1月前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
38 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
1月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
37 2
|
3月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
2月前
|
存储 NoSQL Redis
Redis的RDB快照:保障数据持久性的关键机制
Redis的RDB快照:保障数据持久性的关键机制
53 0
|
2月前
|
存储 缓存 NoSQL
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
深入探究Redis的AOF持久化:保障数据安全与恢复性能的关键机制
88 0
|
3月前
|
NoSQL Redis
Redis——设置最大内存 | key淘汰机制
Redis——设置最大内存 | key淘汰机制
59 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
370 0
|
22天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
46 1
|
27天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。