redis过期时间怎么失效
-
Redis的过期时间是通过设置键值对的过期时间来实现的。当一个键设置了过期时间后,在到达过期时间之后,Redis会将该键从数据库中删除,使其失效。
当一个键的过期时间失效时,主要有两种情况:
-
主动访问键时:当客户端尝试访问一个键时,Redis会检查该键的过期时间。如果键已经过期,则Redis会删除该键并返回空值。这种方式保证了即使过期了,客户端访问该键时仍然能够得到正确的结果。
-
删除键时:当Redis执行删除操作时,它会检查被删除的键是否已经设置了过期时间。如果键已经过期,则Redis会将该键从数据库中删除。如果键没有过期,则Redis会将该键从数据库中删除,并返回删除成功的结果。
需要注意的是,Redis的过期检查并不是实时的,而是惰性的。具体说来,当一个键过期后,并不会立即从数据库中删除,而是在之后的某个时刻进行删除。这是因为Redis为了提高性能,在过期键的检查和删除上使用了一种惰性处理的策略。
另外,需要注意的是,虽然Redis提供了过期时间机制,但是并没有提供绝对精确的过期时间保证。具体来说,当一个键的过期时间到达时,Redis并不是立即将其删除,而是在某个时刻进行删除。这意味着在这个时刻之前,还有可能访问到已经过期的键。
总结起来,Redis的过期时间失效主要是通过客户端访问键的时候和删除键的时候来实现的。在过期键的检查和删除上,Redis使用了一种惰性处理的策略,并且并不提供绝对精确的过期时间保证。
1年前 -
-
Redis的过期时间可以通过设置多种方式进行失效。
-
主动读取数据:当一个已经设置了过期时间的键被访问时,Redis会检查键是否过期。如果过期,Redis会立即删除该键,并返回nil或空值。
-
定时删除策略:Redis会在每个事件循环中检查一定数量的过期键,并删除它们。这个策略的执行频率由配置参数决定,可以通过修改
hz(每秒执行的事件循环次数)来控制。 -
惰性删除策略:Redis在接收到客户端请求时,会先检查是否有过期的键需要删除,如果有,再执行删除操作。这种策略可以避免每个事件循环都做删除操作,减少每次事件循环的开销。
-
定期删除策略:Redis可以通过配置参数
activedefrag来开启定期删除策略。该策略会在后台执行一段时间的键值对整理工作,将过期的键删除,并将内存重新分配给其他键。这种策略可以减少内存碎片并提高性能。 -
使用持久层过期策略:Redis可以将过期键写入RDB持久化文件或AOF日志文件。当Redis重启后,会通过加载这些文件来恢复过期键的状态,并根据过期时间进行删除。这种策略可以确保Redis重启后仍然能够删除过期键。
需要注意的是,虽然Redis会自动删除过期键,但不保证立即删除。在定期删除策略和持久层过期策略中,过期键可能需要等待一段时间才会被删除。因此,在开发中需要注意过期键的处理逻辑,避免依赖已经过期的数据。此外,在设置过期时间时,也需要根据实际业务需求选择合适的过期时间。
1年前 -
-
Redis 是一种开源的内存数据结构存储系统,常用于缓存、发布/订阅系统和排行榜等场景。在 Redis 中,可以通过设置过期时间来使某个键值对在一定时间后自动失效。Redis 提供了多种方式来处理失效过期的键值对,下面将从几个方面介绍 Redis 过期时间的失效机制。
1. Redis 过期时间的设置方式
Redis 提供了 EXPIRE、EXPIREAT 和 PEXPIRE、PEXPIREAT 两种设置过期时间的方式。其中,EXPIRE 和 EXPIREAT 以秒为单位设置过期时间,PEXPIRE 和 PEXPIREAT 以毫秒为单位设置过期时间。
# 使用 EXPIRE 命令设置键值对的过期时间 EXPIRE key seconds # 使用 EXPIREAT 命令设置键值对的过期时间,参数是过期的 UNIX 时间戳 EXPIREAT key timestamp # 使用 PEXPIRE 命令设置键值对的过期时间,参数是过期的毫秒时间戳 PEXPIRE key milliseconds # 使用 PEXPIREAT 命令设置键值对的过期时间,参数是过期的毫秒时间戳 PEXPIREAT key milliseconds-timestamp2. Redis 过期时间的失效机制
Redis 的过期时间是按照惰性删除和定期删除两种方式来实现的。
2.1 惰性删除
当一个键值对过期后,Redis 不会立即将其删除,而是在键被访问时检查键是否过期,如果过期则删除该键。这种机制可以减少删除操作的开销,并且保证查询操作的性能。
但这也意味着当一个过期键如果没有被访问,则不会被自动删除,所以只有当访问次数达到一定数量时才会触发删除操作。这样一来,在过期时间到达之后,键值对实际上可能仍然存在于 Redis 中。
2.2 定期删除
为了处理那些没有被访问到的过期键,Redis 还会定期删除已经过期的键值对。Redis 默认每秒执行 10 次的定期删除操作,通过
hz参数可以调整定期删除操作的频率。在定期删除操作中,Redis 会随机抽取一定数量的键值对,并检查它们是否过期,如果过期则删除。这样可以避免一次性删除大量过期键值对对性能造成的影响。
3. Redis 对过期键的处理
当 Redis 的惰性删除和定期删除都没有删除过期键值对时,Redis 在执行 GET 或者其他操作时会先检查键是否过期,如果过期则返回空值,如果未过期则返回键对应的值。
需要注意的是,对一个键执行修改的操作,即使它已经过期,Redis 也会重新计算它的过期时间。因此,在一些场景中,可以通过更新过期键的值来实现一些特定的逻辑。
总结
Redis 提供了 EXPIRE、EXPIREAT 和 PEXPIRE、PEXPIREAT 四种方式来设置过期时间,通过惰性删除和定期删除两种机制实现过期键的删除。在使用 Redis 的过程中,需要根据具体业务需求和性能考虑合理设置过期时间,并理解过期键的处理机制。
1年前