400-035-6699
当前位置: 首页 » 技术支持 » 博文资讯 »

Redis深入解析:探究内存淘汰策略与数据删除机制详解

Redis作为一种高性能的键值数据库,其过期键的删除策略和内存淘汰机制是保证其高效运行的关键。下面我们来详细了解这两种策略。
首先,Redis的过期键删除策略主要分为两种:惰性删除和定期删除。
惰性删除是指当Redis对键进行读写操作之前,会调用expireIfNeeded函数检查该键是否过期。如果键已经过期,它会被立即删除,然后Redis执行对应的键不存在操作;如果键没有过期,Redis则不进行任何操作,继续执行原本的命令。这种策略的核心在于只在必要时进行过期键的删除,从而节省CPU资源。
定期删除则是由activeExpireCycle函数实现的,该函数以一定的频率运行,每次都会从数据库中随机选择一定数量的键进行检查,并删除其中的过期键。这种策略的优势在于能够定期清理过期键,从而释放内存。
除此之外,还有三种常见的处理过期键的方式:
1. 定时删除:在设置键的过期时间时,同时创建一个定时器,当过期时间到达时,立即执行删除操作。这种方式的优点是能够立即释放过期键占用的内存,但缺点是在键过期较多时,删除操作可能会占用大量CPU时间,影响服务器的响应速度和吞吐量。
2. 惰性删除:设置键的过期时间后,不立即进行删除,而是在键被访问时检查其是否过期。如果过期,则删除该键;如果未过期,则返回键的值。这种方式对CPU友好,因为只有在键被访问时才会进行过期检查。但缺点是对内存不友好,如果过期键一直未被访问,它们将一直占用内存,可能导致内存泄漏。
3. 定期删除:与惰性删除类似,但它是定期进行的。这种方式可以减少删除操作对CPU的影响,因为可以控制删除操作的执行时长和频率。然而,定期删除的挑战在于如何确定合适的执行时长和频率,以避免对CPU造成过大压力或导致过期键占用的内存不能及时释放。
接下来,谈谈Redis的内存淘汰机制。当Redis的内存使用超过maxmemory限制时,会触发内存淘汰机制。Redis提供了以下几种淘汰策略:
- volatile-lru:移除最近最少使用的设置过过期时间的键。 - allkeys-lru:移除键空间中最近最少使用的键。 - volatile-ttl:移除即将过期的键。 - volatile-random:随机移除设置过过期时间的键。 - allkeys-random:随机移除键空间中的键。 - no-eviction:禁止驱逐数据,当内存不足时,新写入操作会报错。 - volatile-lfu:移除最不经常使用的设置过过期时间的键。 - allkeys-lfu:移除键空间中最不经常使用的键。
这些策略各有优缺点,用户可以根据自己的业务需求和Redis的运行环境选择合适的策略。总之,理解Redis的过期键删除策略和内存淘汰机制对于维护其性能和稳定性至关重要。

Redis过期键的删除策略?

Redis深入解析:探究内存淘汰策略与数据删除机制详解

Redis的过期删除策略就是:惰性删除和定期删除两种策略配合使用

惰性删除:Redis的惰性删除策略由db.c/expireIfNeeded函数实现,所有键读写命令执行之前都会调用 expireIfNeeded函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。

定期删除:由Redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。

附:删除key常见的三种处理方式。

1、定时删除

在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。

优点:定时删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除。

缺点:对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响。

2、惰性删除

设置该key 过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。

优点:对 CPU友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。

缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放。从而造成内存泄漏。

3、定期删除

每隔一段时间,我们就对一些key进行检查,删除里面过期的key。

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

缺点:难以确定删除操作执行的时长和频率。如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。

Redis内存淘汰机制?

当现有内存大于 maxmemory 时,便会触发Redis主动淘汰内存方式,有如下几种淘汰方式:

Redis 4.0前提供 6种数据淘汰策略:

volatile-lru:利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!

Redis 4.0后增加以下两种:

volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰(LFU(Least Frequently Used)算法,也就是最频繁被访问的数据将来最有可能被访问到)

allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key。

【限时免费】一键获取网络规划系统模板+传输架构设计+连通性评估方案

相关文章

服务电话:
400-035-6699
企服商城