Redis 过期策略和内存淘汰机制

Redis 过期策略和内存淘汰机制
最新回答
少年风流曾几时

2026-10-22 13:30:44

Redis 过期策略和内存淘汰机制

Redis 的过期策略和内存淘汰机制是其内存管理的重要组成部分,它们共同确保了 Redis 在有限的内存资源下能够高效地运行。

一、过期策略

Redis 提供了过期策略来管理设置了过期时间的 key。这些策略主要包括定时删除、定期删除和惰性删除,但 Redis 实际采用的是定期删除与惰性删除相结合的方式。

  1. 定时删除

    原理:使用一个定时器来监视 key,当 key 过期时自动删除。

    优点:内存及时释放。

    缺点:消耗大量 CPU 资源,特别是在大并发请求下,CPU 需要将时间应用在处理请求上,而不是删除 key。因此,Redis 没有采用这一策略。

  2. 定期删除

    原理:Redis 默认每 100ms 检查一次是否有过期的 key,并随机抽取一部分 key 进行检查(而不是检查所有 key)。如果发现有过期的 key,则进行删除。

    优点:减少了 CPU 资源的消耗,同时能够在一定程度上保证内存的及时释放。

    缺点:由于只是随机抽取 key 进行检查,因此可能存在部分过期的 key 没有被及时删除的情况。

  3. 惰性删除

    原理:当客户端请求访问某个 key 时,Redis 会检查该 key 是否设置了过期时间以及是否已过期。如果已过期,则在返回给客户端之前删除该 key。

    优点:进一步减少了 CPU 资源的消耗,只有在客户端请求访问时才进行检查和删除。

    缺点:如果某个过期的 key 没有被及时访问,那么它就不会被删除,从而可能导致内存占用逐渐增加。

Redis 通过结合定期删除和惰性删除的方式,既减少了 CPU 资源的消耗,又能够在一定程度上保证内存的及时释放。然而,这种策略并不能完全避免内存占用逐渐增加的情况。因此,Redis 还提供了内存淘汰机制来进一步管理内存。

二、内存淘汰机制

当 Redis 的内存使用达到上限时,内存淘汰机制会根据预设的策略来删除一些 key,以释放内存空间。Redis 提供了多种内存淘汰策略,包括:

  1. volatile-lru

    原理:从设置了过期时间的 key 中使用 LRU(最近最少使用)算法进行淘汰。

    适用场景:当希望优先保留最近使用的、且设置了过期时间的 key 时。

  2. allkeys-lru

    原理:从所有 key 中使用 LRU 算法进行淘汰。

    适用场景:当希望优先保留最近使用的 key,而不考虑是否设置了过期时间时。

  3. volatile-lfu(Redis 4.0 版本新增)

    原理:在过期的 key 中,使用 LFU(Least Frequently Used,最不经常使用)算法进行淘汰。LFU 算法根据 key 的访问频率来决定淘汰哪个 key,访问频率越低的 key 越容易被淘汰。

    适用场景:当希望优先保留访问频率较高的、且设置了过期时间的 key 时。

  4. allkeys-lfu(Redis 4.0 版本新增)

    原理:从所有 key 中使用 LFU 算法进行淘汰。

    适用场景:当希望优先保留访问频率较高的 key,而不考虑是否设置了过期时间时。

  5. volatile-random

    原理:从设置了过期时间的 key 中随机淘汰数据。

    适用场景:当希望随机淘汰设置了过期时间的 key 时。

  6. allkeys-random

    原理:从所有 key 中随机淘汰数据。

    适用场景:当希望随机淘汰任意 key 时。

  7. volatile-ttl

    原理:在设置了过期时间的 key 中,根据过期时间进行淘汰,越早过期的优先被淘汰。

    适用场景:当希望优先淘汰即将过期的 key 时。

  8. noeviction(默认策略)

    原理:当内存不足以容纳新写入数据时,新写入操作会报错。

    适用场景:当不希望 Redis 自动删除 key 来释放内存时,可以选择此策略。但需要注意的是,这可能会导致 Redis 无法继续写入新的数据。

通过选择合适的内存淘汰策略,Redis 能够在内存使用达到上限时,根据预设的规则来删除一些 key,从而确保 Redis 的稳定运行。同时,用户也可以根据自己的实际需求来配置和调整这些策略。