redis是如何实现过期的
-
Redis通过使用相关的数据结构和算法来实现键的过期。具体地说,当键的过期时间到达时,Redis会自动将其删除。
在Redis中,对于每个键,可以通过设置expire时间来指定其过期时间。当设置expire时间时,Redis会在该键上启动定时任务,该定时任务会在指定的时间到达时自动删除该键。Redis使用一个称为"过期字典"的数据结构来存储所有设定了过期时间的键,该数据结构中的每个键值对都包含键、过期时间和值。
过期字典的实现方式可分为两种情况。
-
渐进式过期:对于每个键值对,Redis会记录键的过期时间,然后周期性地在处理命令的过程中检查键的过期时间,如果发现某个键已过期,则会删除该键。这种方式虽然可以保证键的过期,但会导致CPU占用较高,不适合大规模过期的情况。
-
定期过期:Redis会创建一个定时任务,每隔一段时间将过期字典中的一部分键进行检查和删除。这样做的好处是将键的过期操作分散到多个时间点进行处理,降低了对CPU的压力。但由于只能定期删除部分过期键,可能会导致一些过期键没有被及时删除。
总结起来,Redis实现过期的方式是通过对设置了过期时间的键进行定时检查和删除。通过使用渐进式过期和定期过期两种方式,确保过期键能够及时删除,从而保持数据的正确性和存储空间的有效利用。
1年前 -
-
Redis是一个开源的基于内存的键值存储系统,它提供了一种快速、灵活且可扩展的方式来存储和检索数据。Redis提供了一些功能来实现键的过期,包括设置过期时间、设置过期事件回调以及惰性删除。
-
设置过期时间: Redis允许为每个键设置一个过期时间,当过期时间到达时,Redis会自动删除该键。可以使用EXPIRE命令为键设置过期时间,例如EXPIRE key seconds,这里的key是要设置过期时间的键,seconds是过期时间,以秒为单位。当键被设置了过期时间后,Redis会在调用GET或者SET等命令时检查键是否过期,如果过期则删除键。
-
过期事件回调:Redis允许用户通过配置文件或者命令来设置一个过期事件回调函数。当一个键过期时,Redis会调用该回调函数来处理一些附加逻辑。这个回调函数可以用来实现一些特定的业务需求,例如记录日志、生成告警等。
-
惰性删除: Redis使用一种称为惰性删除的机制来删除过期键。当一个键过期时,并不会立即删除,而是在之后的一次访问中才会被删除。这样做的好处是避免了删除过期键的开销,在键被访问时才会执行删除操作。这种机制可以提高性能,但是可能会导致过期键占用内存而无法及时释放。
-
定期删除: Redis使用定期删除来删除一些过期键。定期删除是通过Redis的serverCron函数来实现的,该函数会在每个事件循环周期中被调用。在定期删除过程中,Redis会随机选择一部分键进行检查,并删除其中过期的键。
-
内存淘汰策略: 当Redis的内存使用达到一定的限制时,为了释放内存,Redis会根据一定的策略来删除一些键。这些策略包括随机删除、最近最少使用删除、最少访问频率删除等。删除过期键是这些策略的一部分,Redis会优先删除过期键来释放内存。
总结起来,Redis实现过期的方式包括设置过期时间、设置过期事件回调、惰性删除、定期删除以及内存淘汰策略。这些机制可以使Redis及时删除过期键,释放内存,同时保证高效的数据存储和检索。
1年前 -
-
Redis 是一个开源的内存数据结构存储系统,通常被用作数据库、缓存和消息队列。Redis 的过期机制是通过设置过期时间来实现的,当键过期时,Redis 会自动将其删除。
下面是 Redis 实现过期的工作原理和操作流程:
-
设置键的过期时间
在 Redis 中,可以使用 EXPIRE 命令设置键的过期时间,命令格式为 EXPIRE key seconds,其中 key 是要设置过期时间的键,seconds 是过期时间,单位为秒。当 EXPIRE 命令执行成功后,键的过期时间会被设置为指定的秒数。 -
判断键是否过期
Redis 内部会以一定的频率检查部分键是否过期,以及在执行读写操作时检查是否有过期的键。Redis 使用惰性过期控制策略,当客户端访问一个键时,Redis 会先检查该键是否过期,如果过期则删除该键并返回空值。 -
删除过期键
当检查到过期的键时,Redis 会将其删除。在删除键时,Redis 会调用内部的删除过期键的函数(expires.c/fileEventExpireCycle),并通过调用该函数维护一个跳跃表,跳跃表中存储了所有带过期时间的键,过期时间是一个有序的、递增的双向链表,通过跳表可以快速定位过期键。 -
过期键的删除策略
Redis 提供了多种过期键的删除策略,可以通过配置文件 redis.conf 中的配置项来设置。常用的过期键删除策略有以下几种:
- 定时删除(默认):每隔一定的时间,Redis 就会从过期键中随机选取一部分键进行删除。这种策略比较简单,但可能会导致某些过期键一直存在未被删除。
- 惰性删除:每次访问一个键时,Redis 会检查是否过期,如果过期则删除。这种策略可以确保过期键被及时删除,但增加了每次访问键的时间开销。
- 定期删除:每隔一定的时间,Redis 会从过期键中选取一部分键进行删除。和定时删除相比,定期删除可以避免集中删除键的情况,减少对 Redis 的影响。
- 内存回收
当 Redis 删除过期键后,内存并不会立即释放,而是通过一种称为内存回收的机制来释放。Redis 使用惰性删除和定期删除策略时,当删除键后,Redis 会将其标记为过期,并将其放入到一个专门的内存回收列表中。当需要内存时,Redis 会根据配置文件中的内存回收策略来选择具体回收的方式。
总结:
Redis 实现过期的机制是通过设置过期时间和惰性过期控制策略来实现的。当键过期时,Redis 会自动将其删除。Redis 提供了多种过期键的删除策略,包括定时删除、惰性删除和定期删除。在删除过期键后,Redis 使用内存回收机制来释放内存。这种过期机制可以确保 Redis 的内存不会无限增长,提高系统性能。1年前 -