redis是怎么过期的

fiy 其他 41

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Redis 中键值对的过期策略有两种,分别是:定时过期和惰性过期。

    首先是定时过期。当设置键的过期时间时,Redis会为每个键设置一个过期时间(ttl)值,并创建一个定时器。定时器会在键的过期时间到达时立即执行,将键删除。

    其次是惰性过期。当访问一个键时,Redis会先检查该键是否过期。如果过期,则删除该键并返回空值。这种机制保证了在键过期后,仍然可以访问到最新的键值对。但它也带来了一定的性能开销,因为需要在访问时检查键的过期状态。

    为了避免过多的定时器产生,Redis采用了一种优化策略,即通过惰性过期来进行删除。在每次访问键时,Redis会检查键是否过期,并进行删除。这种方式可以避免大量的定时器产生,减少了系统开销。

    需要注意的是,惰性过期并不是精确的,它是以一定的概率进行删除的。因为 Redis 将键的过期时间分割成若干个小的时间片段,每次访问键时只检查当前时间片段是否过期,如果过期则进行删除。这种策略可以减少每次访问时的开销,提高性能。

    总结来说,Redis 的键值对过期策略有定时过期和惰性过期两种方式。定时过期通过设置定时器,在到达过期时间时删除键。而惰性过期是在每次访问键时检查是否过期,并进行删除。为了减少定时器产生,Redis采用了惰性过期进行删除,并以时间片段的方式进行优化。

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

    Redis 的数据过期机制是基于键值对的 TTL(time to live)设置来实现的。当一个键设置了 TTL 后,Redis 会自动在指定的时间过期后将其删除。

    以下是 Redis 数据过期的几个关键点:

    1. 键的 TTL 设置:在使用 Redis 保存数据时,可以通过 EXPIRE 命令或 SET 命令的 EX 参数设置键值对的 TTL。例如,可以使用以下命令设置一个键值对在 60 秒后过期:

      SET key value EX 60
      
    2. 过期时间的计算:Redis 使用一个简单的定时任务来检查键是否过期。在设置 TTL 的同时,Redis 会维护一个堆排序的过期时间队列,以便能够快速找到即将过期的键。当一个键到达过期时间时,Redis 会在后台进行异步删除。

    3. 续期操作:如果在键的过期时间即将到达时,对该键进行了读或写操作,Redis 会自动将其过期时间续期。这意味着,只要键一直被访问,它将不会被自动删除,除非手动删除或重新设置其 TTL。

    4. 延迟删除:为了防止在一个高并发的环境中删除大量过期键对 Redis 主线程的影响,Redis 引入了延迟删除的机制。具体来说,当过期键被检测到时,Redis 并不立即删除它们,而是将它们添加到一个专门的延迟队列中。在后续的清理周期中,Redis 会在后台进行批量删除操作。

    5. 内存回收:由于 Redis 是内存数据库,过期键的删除对于释放内存非常重要。但是,即使过期键被删除了,底层的物理内存并不会立即释放,而是在后续写操作时进行内存回收。Redis 使用的是惰性删除机制,也就是说,它只在有需要时才会将内存回收给操作系统。

    通过合理地使用 TTL 设置,可以在 Redis 中实现数据的自动过期,从而节省内存空间,并提高性能。但需要注意的是,过多地使用过期时间可能会增加 Redis 的内存压力,因为 Redis 在检查键的过期状态时需要更多的 CPU 资源。因此,在应用程序中需要根据具体场景合理设置键的 TTL。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Redis 是一个开源的内存数据存储系统,可以用作数据库、缓存和消息中间件。在 Redis 中,过期的键值对会被自动删除,以便释放内存空间并维护数据的实效性。Redis 使用两种方式来判断键值对是否过期:惰性删除和定期删除。

    一、惰性删除(Lazy deletion)
    惰性删除是指在客户端尝试访问某个键值对时,Redis 会先检查该键值对是否已经过期,如果已经过期,则会删除该键值对并返回空结果给客户端。这种方式在访问键值对时判断是否过期,没有频繁地扫描所有键值对,能够节省计算资源。

    惰性删除的缺点是如果某个键过期后很长时间没有被访问,它仍然会占用内存。因此,Redis 同时使用定期删除来解决这个问题。

    二、定期删除(Expiration scanning)
    定期删除是指 Redis 在每隔一段时间内,会随机抽取一部分键值对进行检查,删除其中过期的键值对。这样可以避免惰性删除的缺点,及时清理过期的键值对并释放内存空间。

    定期删除并不是在每个键上设置删除时间,而是通过扫描随机的一部分键值对来判断其是否过期。默认情况下,Redis 每秒钟会随机检查一定数量的键值对,默认检查的键值对数量由 hz 配置参数决定。

    三、过期策略的配置
    在 Redis 中,可以通过设置过期时间(expire),或者设置过期的时间单位(expireat)来设置键值对的过期时间。过期时间可以精确到秒(seconds)或是毫秒(milliseconds),灵活地满足不同需求。

    Redis 还可以通过 config set 命令来配置过期策略。config set 命令有两个与过期策略相关的参数:

    • maxmemory-policy:设置 Redis 的内存淘汰策略,控制内存在达到极限时会采用什么策略来释放内存空间。常用的策略有 noevictionallkeys-lruvolatile-lru 等。
    • hz:设置定期删除操作的执行频率,即每秒钟检查的键值对数量。

    通过合理的过期策略配置,可以提高 Redis 的性能和资源利用率,并确保数据的实效性。

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

400-800-1024

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

分享本页
返回顶部