redis如何处理过期key
-
Redis是一种高性能的键值存储数据库,它提供了一种用于过期键的机制,以便自动删除不再需要的数据。
在Redis中,每个键都可以设置过期时间。当一个键设置了过期时间后,在该时间到达之后,Redis会自动删除这个过期键。
Redis处理过期键的方式主要有两种:惰性删除和定期删除。
-
惰性删除:当用户尝试访问一个键时,Redis会先检查该键是否过期,如果过期,则会立即删除该键并返回空值或错误。这种方式的好处是可以节省内存空间,只删除用户需要的数据。但是它也有缺点,即会增加访问延迟,因为需要在每次访问时进行过期键的检查。
-
定期删除:Redis会以一定的时间间隔(默认是100ms)扫描一定数量的键,查找并删除其中的过期键。这种方式可以有效地减少内存空间的占用,并避免了频繁的过期键检查。但是它也有缺点,即可能会导致某些过期键被删除的不及时,占用了一段时间内的内存空间。
为了更好地处理过期键,Redis还使用了一种叫做惰性删除和定期删除的混合策略。这种混合策略兼具了惰性删除的实时性和定期删除的节省内存的优点。
总结起来,Redis处理过期键的方式主要有惰性删除和定期删除。惰性删除会在用户访问过期键时立即删除,节省内存空间,但会增加访问延迟;定期删除会定期删除一定数量的过期键,减少内存占用,但可能导致一些过期键的滞留。为了兼具实时性和节省内存的优点,Redis采用了惰性删除和定期删除的混合策略。
1年前 -
-
Redis是一个开源的基于内存的数据库,它支持各种数据结构,如字符串、哈希、列表、集合、有序集合等。当在Redis中设置一个key和对应的值时,可以为该key设置一个过期时间。过期key是指在一段时间后自动从Redis数据库中删除的key。
Redis处理过期key的方式如下:
-
惰性删除:当客户端尝试访问一个key时,Redis会检查该key是否过期,如果过期则删除该key并返回nil或错误。这种方式延迟了删除操作的执行,但增加了每次访问key的开销。
-
定期删除:Redis主线程会定期检查数据库中的过期key,并删除它们。定期删除是通过在每个数据库中维护一个定时器来实现的。定时器每隔一段时间被激活,然后检查该数据库中的一部分过期key,并删除它们。这种方式具有一定的延时性,因此在每次执行删除操作时,实际上可能会有一些过期key没有被删除。
-
主动删除:当Redis需要访问一个key时,会先检查它是否过期,如果过期则立即删除,并返回nil或错误。这种方式在访问key时会增加一些开销,但可以立即释放过期key占据的内存空间。
-
RDB文件的载入:当Redis通过RDB文件进行数据恢复时,会在载入每个key的同时检查它是否过期,如果过期则跳过载入操作。这种方式可以避免重复载入过期key的数据。
-
数据库分片:当Redis的数据量非常大时,可以使用数据库分片将数据分散到多个Redis实例中。每个实例负责处理一部分key,从而减轻单个实例的负担。当一个key过期时,只需要在对应的实例中删除它即可,而不会影响其他实例的工作。
通过以上方式,Redis可以高效地处理过期key,并保证数据库的性能和可用性。
1年前 -
-
Redis 是一个高性能的键值存储系统,它使用简单的键值对数据结构来存储数据。当一个键值对在 Redis 中过期后,它将被自动删除。在 Redis 中,通过设置 TTL(生存时间)来控制键值对的过期时间。当键值对的 TTL 到期时,Redis 将自动删除该键值对。
Redis 内部采用了两种不同的过期键处理策略,分别是惰性过期和定期过期。
-
惰性过期(Lazy Expiration)
惰性过期是指当发生读操作时,Redis 在读取键值对之前会先检查该键值对是否过期,如果过期则立即删除。这种方法会带来额外的 CPU 开销,因为需要检查每个键值对的过期时间。但是,优点是能够立即释放过期的键值对,使得内存空间得到回收。 -
定期过期(Scheduled Expiration)
定期过期是指 Redis 使用一个定时器来定期扫描数据库,以检查是否有过期的键值对。Redis 会将过期键值对放入到一个特殊的字典中。当发生读写操作时,Redis 并不会立刻删除过期的键值对,而是等到定期扫描时再进行删除。这种方式减少了 CPU 开销,但是可能会导致内存占用过高,因为过期的键值对可能长时间未被删除。
下面是 Redis 处理过期键的具体步骤:
-
写入键值对时,可以设置一个 TTL 值,单位是秒。如果未设置 TTL,则键值对将永不过期。
SET key value EX seconds -
Redis 内部维护了一个过期字典(expires dictionary),用于存储所有设置了过期时间的键值对。过期字典的键是键值对的键,值是键设置的过期时间的 UNIX 时间戳。
-
惰性过期:当发生读操作时,Redis 会在读取键值对之前检查键是否过期,如果过期则立即删除。
-
定期过期:Redis 使用一个定时器异步地检查过期字典中的键是否过期。遍历过期字典,逐个检查键是否过期。如果发现过期的键,则将其删除。
-
当发生写操作时,如果发现被写入的键已经存在于过期字典中,则将其从过期字典中删除。
总结一下,Redis 处理过期键采用了惰性过期和定期过期两种策略,通过设置 TTL 值来控制键值对的过期时间。惰性过期是在读取键的时候检查过期,在设置键值对时可以及时删除过期的键值对;定期过期是使用一个定时器来异步地检查过期字典中的键是否过期,定期删除过期的键值对。这种设计既能保证读取操作的性能,又能及时地释放过期的键值对。
1年前 -