redis过期怎么回收
-
Redis 是一种开源的内存数据库,具有高性能和高可扩展性。在 Redis 中,可以使用过期时间来自动删除过期的键值对,以释放内存空间。当 Redis 中的键值对过期后,会触发过期键回收机制来删除这些过期的键值对。下面将详细介绍 Redis 过期回收的原理和回收过程。
Redis 的过期回收机制是以惰性删除和定期删除为基础。惰性删除是指在获取某个键的时候,Redis 会检查该键是否过期,如果过期就会被删除;定期删除是指 Redis 会定期扫描一定数量的键,并检查是否过期,如果过期就会删除。
具体来说,在 Redis 中,每个键值对都有一个过期时间,这个过期时间可以通过 EXPIRE 或者 SETEX 命令设置。当键的过期时间到达后,不会立即删除键值对,而是等到某个时刻进行懒惰删除或定期删除。
-
惰性删除:
当客户端尝试访问一个键时,Redis 会先检查这个键是否过期,如果过期就删除。这种方式可以保证过期的键在访问时被删除,但也会带来额外的消耗。因为在每次访问键时都需要进行过期检查,会降低 Redis 的吞吐能力。 -
定期删除:
Redis 会采取一种定期删除机制,每隔一段时间检查一定数量的键,删除过期的键。具体的过程如下:
- Redis 会创建一个字典,字典的键是散列值(hash)。
- 每次执行定期删除时,Redis 会从字典中随机选择一定数量的键。
- 这些键中的过期键将会被删除。
需要注意的是,定期删除是以时间为基础的删除策略。Redis 会将每个键的过期时间转换为 UNIX 时间戳,并以此为依据进行比较和删除。定期删除不保证一定会删除所有过期键,但会通过随机采样来提高删除效率。
总结来说,Redis 的过期回收采用惰性删除和定期删除两种方式。惰性删除保证了过期键在访问时被删除,但会带来一定的性能损耗;定期删除则通过定期扫描一定数量的键进行删除,以保持 Redis 的性能和内存空间的平衡。
1年前 -
-
Redis的过期键回收机制是基于惰性+定期的策略。当一个键过期后,Redis并不会立即删除它,而是在特定的时机进行删除操作。
下面是Redis过期键回收的工作原理和相关策略:
-
惰性删除(Lazy Deletion):
当客户端尝试访问一个过期的键时,Redis会先对键进行检查。如果键过期了,Redis会将其删除并返回空值,实现了惰性删除。- 过期键的删除检查放在读取操作时进行,这样可以避免在写操作时对过期键进行无效的删除操作。
- 惰性删除的缺点是,如果一个过期键一直未被访问,那么它将一直留在内存中,占用内存空间。
-
定期删除(定时任务):
为了解决惰性删除带来的缺点,Redis引入了定期删除机制。定期删除是通过定时器来实现的,定时器默认每秒执行10次。- Redis将所有的过期键放入一个已过期键的字典中,定期删除器每次执行时都会随机选择一部分过期键进行检查和删除。这样可以避免在单次操作中删除大量过期键对服务器造成过大的负担。
- 定期删除的频率和删除的键数可以通过配置文件中的参数来设置,以满足不同场景下的需要。例如,可以通过降低定期删除的频率来减少CPU消耗。
-
内存溢出处理:
当Redis的内存使用达到一定的阈值时,会触发内存溢出处理。主要有以下两种策略:-
渐进式清理:Redis会尝试启动子进程,将数据从内存中迁移到磁盘上的swap区域,以释放内存空间。这个过程是渐进进行的,即每次迁移一小部分数据,避免对系统的过大影响。
-
内存到达阈值时拒绝写入:当Redis的内存使用接近达到最大限制时,可以设置参数让Redis拒绝写入新的键值对。这样可以避免内存溢出导致系统崩溃。
-
-
主动回收:
当Redis空闲时,可以通过执行持久化操作(RDB或AOF)来进行主动回收。持久化操作会从内存中将数据写入磁盘,这样可以释放内存空间。主动回收的前提是Redis的空闲时间较长,并且持久化操作不会对系统的性能造成明显影响。 -
配置优化:
Redis提供了一些与过期键回收相关的配置选项,可以根据实际情况进行优化。- maxmemory:用来设置Redis的最大内存限制。
- maxmemory-policy:用来设置内存溢出时的处理策略。
- maxmemory-samples:用来设置每次定期删除时随机选取的过期键的样本数。
通过合理设置这些配置选项,可以优化Redis的过期键回收机制,提高系统的性能和稳定性。
1年前 -
-
Redis是一款基于键值对的内存数据库,为了更好地管理内存,Redis通过设置过期时间来自动删除过期的键值对,以减少内存占用。下面将从方法和操作流程两个方面分别讲解Redis过期键的回收过程。
一、方法
Redis提供了两种回收过期键的方法,分别是主动回收和被动回收。-
主动回收:采用的是定期删除策略,即Redis会在指定的时间间隔内,对过期键进行检查,并删除已过期的键值对。
-
被动回收:采用的是惰性删除策略,即当客户端再次访问一个已过期的键时,Redis会检测到这个键已经过期,并进行删除操作。
二、操作流程
下面将分别介绍主动回收和被动回收的操作流程。- 主动回收流程
(1)设置过期时间:在设置键值对时,可以通过EXPIRE命令或者SET命令的EX参数来设置键的过期时间。例如,使用EXPIRE命令将键mykey的过期时间设置为10秒:EXPIRE mykey 10。
(2)定期删除:Redis会通过使用一个定时器,每隔一段时间检查一部分设置了过期时间的键,删除已过期的键值对。检查的频率可以通过配置文件中的hz参数进行调整,默认为10,即每秒检查10次。
(3)删除过期键:当Redis检测到某个键已经过期时,会立即删除对应的键值对。键值对的删除是通过Redis的dict.h/dict.c哈希表来实现的。
- 被动回收流程
(1)访问过期键:当客户端再次访问一个已经设置过期时间的键时,Redis会先检查这个键是否已经过期。
(2)删除过期键:如果键已经过期,则Redis会立即删除对应的键值对。键值对的删除是通过Redis的dict.h/dict.c哈希表来实现的。
总结:
通过主动回收和被动回收两种方法,Redis能够有效地回收过期键。主动回收通过定期删除策略,定时检查并删除过期的键值对;被动回收通过惰性删除策略,在客户端再次访问时检测并删除过期的键值对。这两种方法结合起来,可以保证Redis的内存使用效率。1年前 -