redis如何知道key过期

不及物动词 其他 44

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Redis是一个快速高效的键值存储数据库,它可以为每个键设置过期时间。当键的过期时间到达后,Redis会自动将该键删除。那么Redis是如何知道键是否过期的呢?

    Redis使用一种称为"惰性删除"的策略来检测和删除过期键。具体的过程如下:

    1. 设置键的过期时间:当我们向Redis设置一个键时,可以通过使用EXPIRE命令或者设置键的过期时间来指定该键的过期时间。Redis会在键的值上面关联一个到期时间,表示该键的生存时间。

    2. 惰性删除策略:Redis不会立即检测过期键并将其删除,而是在对键进行读写操作时才会进行检测。这种策略可以避免不必要的资源浪费,因为如果一个键永远不被访问,那么它就没有必要再去检测和删除。

    3. 检测过期键:当我们对一个键进行读写操作时,Redis会先检测该键是否过期。如果已经过期,Redis会将该键标记为"已过期"。

    4. 删除过期键:当我们再次对一个已过期的键进行读写操作时,Redis会将该键从数据库中删除。

    需要注意的是,惰性删除策略可能会导致一些过期键长时间存在于数据库中,直到被读写操作触发删除。如果我们希望及时删除过期键,可以使用Redis的定时任务机制,以固定的时间间隔主动触发过期键的删除操作。

    总结起来,Redis通过惰性删除策略来检测和删除过期键,只有在对键进行读写操作时才会进行检测。这种策略可以有效地减少资源消耗,并提高Redis的性能。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Redis通过使用一种称为“过期策略”的机制来确定key是否已过期。具体来说,Redis使用了两种不同的过期策略:惰性过期和定期过期。

    1. 惰性过期(Lazy Expiration):当客户端尝试获取一个已过期的key时,Redis会立即删除该key并返回nil。这种机制称为惰性过期,因为Redis在需要使用这个key时才会检查它是否过期。

    2. 定期过期(Deletion of Expired Keys in Background):Redis还使用一种称为“定期过期”的机制来检查和删除已过期的key。Redis会在每个Redis实例单独的线程中以固定间隔执行这个操作。这个线程会扫描数据库中的一小部分keys并检查它们是否已过期,如果发现key已过期,则会在后台删除它们。

    在执行过期检查时,Redis使用了一种优化方法称为“过期检查的默认检查量”(Eviction Policy)。具体而言,Redis将每个key的过期时间与当前时间进行比较,如果过期时间小于当前时间,则认为这个key已经过期。但是,由于在每次检查时处理整个数据库可能会导致性能问题,因此Redis只会检查数据库中的一小部分keys。

    通过这两种过期策略的结合,Redis能够及时删除已过期的key并释放内存空间,同时也确保了高性能的数据访问和操作。同时,开发者也可以通过Redis提供的命令来手动设置key的过期时间,以及获取和管理已过期的key等操作。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Redis是一个基于内存的键值存储数据库,它可以用于缓存、消息队列、持久化等多种用途。当我们在Redis中设置键值时,还可以为键设置过期时间。Redis通过定期检查键的过期时间来判断键是否过期。

    具体来说,当我们为键设置过期时间时,Redis会在内部维护一个过期字典,该字典以键为对象,以过期时间为键值对。在设置过期时间时,Redis会将键与对应的过期时间一起记录在过期字典中。

    在Redis的事件循环中,会定期执行一个过期键检查的操作。该操作会遍历过期字典中的键,检查对应的过期时间是否已到。如果某个键的过期时间已经到了,Redis会将该键从数据结构中删除,并在需要的情况下触发相应的事件,比如执行“过期键删除时触发”的触发器。

    那么,具体的操作流程是怎样的呢?下面我们将详细介绍。

    1. 设置键的过期时间

    在Redis中,我们可以使用EXPIREPEXPIRE命令为键设置过期时间。比如,我们可以使用以下命令为键mykey设置过期时间为10秒:

    EXPIRE mykey 10
    

    在这个例子中,键mykey的过期时间将在10秒后到期。

    2. 内部维护过期字典

    当我们设置了键的过期时间后,Redis会在内部维护一个过期字典。该字典以键为对象,以过期时间为键值对。在设置键的过期时间时,Redis会将键与对应的过期时间一起记录在过期字典中。过期字典采用哈希表作为数据结构,可以以O(1)的时间复杂度进行操作。

    3. 定期检查过期键

    在Redis的事件循环中,会定期执行一个过期键检查的操作。该操作会遍历过期字典中的键,检查对应的过期时间是否已到。

    具体的过期键检查算法如下:

    • Redis会以redis.hz/REDIS_EXPIRELOOKUPS_PER_CYCLE的频率进行检查。redis.hz是Redis配置文件中设置的一个配置项,表示每秒钟的执行次数。
    • Redis每次检查的键数量由REDIS_EXPIRELOOKUPS_PER_CYCLE配置项决定。
    • Redis会将过期字典分成多个槽位,并通过轮询的方式检查每个槽位。
    • 对于过期的键,Redis会将其从数据结构中删除,并在需要的情况下触发相应的事件,比如执行“过期键删除时触发”的触发器。

    4. 内存回收策略

    在Redis中,过期键的删除操作并不是立即执行的。为了提高Redis的性能,Redis采用了惰性删除和定期删除两种策略。

    • 惰性删除:当我们在获取某个键对应的值时,Redis会检查该键是否过期。如果过期,会将该键从数据结构中删除,然后返回nil给客户端。
    • 定期删除:在Redis的事件循环中,会定期执行一个过期键检查的操作。该操作会检查过期字典中的键,并删除过期的键。定期删除操作的执行频率由redis.hz配置项决定。

    通过惰性删除和定期删除,Redis可以高效地回收过期键占用的内存空间,同时避免了频繁删除造成的性能开销。

    5. 持久化存储中的过期键

    在Redis的持久化存储中,过期键会被保存下来。这是因为持久化存储的目的是将Redis中的数据持久化到硬盘上,以便重启时可以恢复数据。而过期键在持久化过程中也会被保存下来,以便在重启时可以继续执行过期键删除操作。

    需要注意的是,在Redis的持久化存储中,过期键并不会自动删除。这是因为Redis是一个基于内存的键值存储数据库,它的性能主要依赖于内存。当过期键被持久化后,Redis不会频繁地检查过期键是否过期。如果需要手动删除过期键,可以使用DEL命令进行操作。

    综上所述,Redis通过定期检查键的过期时间来判断键是否过期。通过维护过期字典和定期检查等机制,可以高效地管理过期键,并回收占用的内存空间。通过持久化存储,过期键也可以在重启时继续执行删除操作。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部