阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略

简介: 大家好,我是 V 哥。粉丝小 A 面试阿里时被问到 Redis 的内存淘汰策略问题,特此整理了一份详细笔记供参考。Redis 的内存淘汰策略决定了在内存达到上限时如何移除数据。希望这份笔记对你有所帮助!欢迎关注“威哥爱编程”,一起学习与成长。

大家好,我是 V 哥,粉丝小A面试阿里,说被问到 Redis 的内存淘汰策略的问题,整理这个笔记给他参考,也分享给大家,如果你遇到这个问题,会怎么回答呢?

Redis 的内存淘汰策略是指当Redis的内存使用量达到设定的上限时,决定哪些数据应该被移除以便为新数据腾出空间的规则。Redis 提供了多种内存淘汰策略,可以通过配置文件中的 maxmemory-policy 指令来设置。以下是 Redis 支持的主要内存淘汰策略:

  1. noeviction:这是默认策略,当内存使用达到限制时,Redis 会拒绝新的写入操作,并返回错误,但不会淘汰任何数据。

  2. allkeys-lru:在所有键中,基于最近最少使用(LRU)算法淘汰数据。Redis 会维护一个近似的 LRU 列表,并不保证完全精确,但是对大多数使用场景来说是足够的。

  3. allkeys-lfu:在所有键中,基于最少频率使用(LFU)算法淘汰数据。LFU 算法会跟踪每个键的访问频率,并淘汰访问频率最低的键。

  4. volatile-lru:仅在设置了过期时间的键中,基于 LRU 算法淘汰数据。

  5. volatile-lfu:仅在设置了过期时间的键中,基于 LFU 算法淘汰数据。

  6. volatile-random:在设置了过期时间的键中随机选择淘汰。

  7. allkeys-random:在所有键中随机选择淘汰。

  8. volatile-ttl:在设置了过期时间的键中,淘汰那些 TTL(Time To Live)值最小的键,也就是即将过期的键。

以上是8种不同的淘汰策略,选择哪种淘汰策略取决于具体的使用场景和业务需求。例如,如果你希望 Redis 作为缓存使用,并且缓存的数据大多是临时性的,那么可能会选择 allkeys-lruvolatile-lru。如果你的应用中有明确的热点数据,可能会选择 allkeys-lfuvolatile-lfu 来确保热点数据不会被轻易淘汰。

Redis 还提供了一些工具和命令来帮助监控和优化内存使用,例如 INFO memory 命令可以查看内存使用情况,CONFIG SET maxmemory 可以动态调整内存上限。

在 Redis 4.0 版本后引入了 MEMORY 命令,可以更细致地管理和分析内存使用情况。例如,MEMORY USAGE 可以估算键值对的内存使用量,MEMORY STATS 可以显示内存使用的详细信息。

Redis 的内存淘汰是在后台异步进行的,因此即使达到了内存上限,也不会立即淘汰数据,而是在新的写入操作发生时根据配置的策略进行淘汰。

noeviction

noeviction 是 Redis 默认的内存淘汰策略。当 Redis 的内存使用量达到 maxmemory 配置的限制时,如果尝试执行可能导致更多内存使用的命令(如 SET、LPUSH、SADD 等),Redis 将返回错误,而不是淘汰任何现有的键值对。

在以下应用场景中可以使用

  1. 数据保留:如果你的应用场景中,每个数据项都非常重要,不能丢失,那么 noeviction 策略可以确保即使在高内存使用的情况下,数据也不会被自动淘汰。

  2. 内存充足的环境:如果你的服务器有足够的内存,或者 Redis 实例被限制在一个相对较小的数据集上,那么使用 noeviction 策略可以避免复杂的淘汰逻辑,简化内存管理。

  3. 消息队列:在某些使用 Redis 作为消息队列的场景中,可能会希望确保所有消息都能被处理,而不是在内存压力下丢失消息。

  4. 缓存预热:在缓存预热阶段,可能会希望保持缓存数据的完整性,直到缓存稳定后再根据实际访问模式进行淘汰。

怎么用

  1. 配置文件设置:在 Redis 配置文件 redis.conf 中,可以通过设置 maxmemory-policy noeviction 来启用 noeviction 策略。
   maxmemory-policy noeviction
  1. 运行时设置:也可以在 Redis 运行时使用 CONFIG SET 命令来动态更改内存淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy noeviction
  1. 命令行设置:如果你使用的是 Redis 命令行工具,也可以在启动 Redis 服务时通过命令行参数设置。
   redis-server --maxmemory-policy noeviction

小结一下

  • 当设置为 noeviction 时,Redis 会记录内存使用量,但不会主动淘汰任何键值对。
  • 如果内存使用量达到限制,Redis 会拒绝那些可能会增加内存使用的命令,并返回错误信息,如 (error)OOM command not allowed when used memory>'maxmemory'
  • 这种策略下,只有当客户端显式地删除键值对或键值对过期时,内存才会被释放。
  • 由于不自动淘汰数据,使用 noeviction 策略时需要更加谨慎地监控内存使用情况,并确保有足够的内存空间来处理数据的增长。

敲黑板啦,注意事项

  • 使用 noeviction 策略时,需要确保服务器有足够的内存来处理数据的增长,否则 Redis 可能会因为内存不足而无法处理新的写入请求。
  • 在某些情况下,如果 Redis 长时间无法处理写入请求,可能会导致客户端操作超时或错误,影响应用程序的正常运行。
  • 如果你的应用可以容忍数据的丢失,或者有其他机制来处理数据淘汰(如定期清理旧数据),那么可以考虑使用其他淘汰策略来更有效地管理内存。

allkeys-lru

allkeys-lru 是 Redis 的一种内存淘汰策略,全称为 "all keys least recently used"。这种策略会在所有键中,包括那些没有设置过期时间的键,基于最近最少使用算法(LRU)来淘汰数据。

适合的应用场景

  1. 缓存应用:在缓存场景中,通常需要保留最近被访问的数据,以便快速响应后续的读取请求。allkeys-lru 策略可以确保缓存中的数据是最近被访问的,从而提高缓存效率。

  2. 数据访问模式均匀:如果你的应用中所有数据的访问模式相对均匀,没有特别明显的热点数据,那么 allkeys-lru 可以作为一个合理的选择,因为它会淘汰最不活跃的数据。

  3. 数据替换:在某些应用中,可能需要定期替换旧数据以保持数据的新鲜度,allkeys-lru 策略可以帮助实现这一点。

  4. 内存限制严格:在内存使用有严格限制的环境中,allkeys-lru 可以作为一种自动的数据淘汰机制,以确保内存使用不会超过设定的限制。

怎么用

  1. 配置文件设置:在 Redis 配置文件 redis.conf 中,可以通过设置 maxmemory-policy allkeys-lru 来启用 allkeys-lru 策略。
maxmemory-policy allkeys-lru
  1. 运行时设置:也可以在 Redis 运行时使用 CONFIG SET 命令来动态更改内存淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru
  1. 命令行设置:如果你使用的是 Redis 命令行工具,也可以在启动 Redis 服务时通过命令行参数设置。
   redis-server --maxmemory-policy allkeys-lru

小结一下

  • LRU 算法:最近最少使用(LRU)是一种常见的页面置换算法,它基于这样一个假设:如果数据最近被访问过,那么将来被访问的几率也更高。LRU 算法会跟踪每个数据项的访问时间,并在需要淘汰数据时选择最久未被访问的数据。

  • 淘汰过程:当 Redis 的内存使用量达到 maxmemory 限制时,Redis 会根据 LRU 算法淘汰最久未被访问的键值对,直到内存使用量降到限制以下。

  • 近似实现:Redis 实现的 LRU 算法是一个近似版本,它通过定期检查一组随机键,并淘汰其中最久未被访问的键来工作。这样可以在不牺牲太多性能的情况下,近似地实现 LRU 算法。

  • 配置样本大小:Redis 允许你通过 maxmemory-samples 配置来调整用于淘汰决策的键样本大小。增加样本大小可以提高淘汰决策的准确性,但可能会增加 CPU 的使用率。

敲黑板:注意的地方

  • 数据丢失:使用 allkeys-lru 策略时,需要意识到一些最近没有被访问的数据可能会被自动淘汰,这可能导致数据丢失。

  • 性能考虑:虽然 LRU 算法可以提高缓存命中率,但 Redis 需要维护额外的访问时间信息,这可能会对性能产生一定影响。

  • 监控:建议监控 Redis 的内存使用情况和淘汰事件,以确保系统按预期工作,并及时调整策略或增加内存资源。

  • 业务适配:在决定使用 allkeys-lru 策略之前,应考虑业务需求和数据访问模式,确保该策略与业务目标一致。

allkeys-lfu

allkeys-lfu 是 Redis 的一种内存淘汰策略,全称为 "all keys least frequently used"。这种策略会在所有键中,包括那些没有设置过期时间的键,基于最少频率使用算法(LFU)来淘汰数据。

适合用的应用场景

  1. 访问模式不均匀:在数据访问模式不均匀的情况下,某些键可能被频繁访问,而另一些键则很少被访问。allkeys-lfu 策略可以确保经常访问的键不会被轻易淘汰。

  2. 热点数据保留:如果你的应用中有热点数据,即那些被频繁访问的数据,使用 allkeys-lfu 策略可以确保这些热点数据不会因为最近最少使用算法而被误淘汰。

  3. 数据重要性:在某些应用中,数据的重要性与其被访问的频率成正比。使用 allkeys-lfu 策略可以保留那些被认为更重要的数据。

  4. 避免数据抖动:在一些实时性要求高的应用中,如推荐系统或实时分析系统,使用 allkeys-lfu 策略可以减少因为数据被淘汰而导致的抖动。

怎么用

  1. 配置文件设置:在 Redis 配置文件 redis.conf 中,可以通过设置 maxmemory-policy allkeys-lfu 来启用 allkeys-lfu 策略。
   maxmemory-policy allkeys-lfu
  1. 运行时设置:也可以在 Redis 运行时使用 CONFIG SET 命令来动态更改内存淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lfu
  1. 命令行设置:如果你使用的是 Redis 命令行工具,也可以在启动 Redis 服务时通过命令行参数设置。
   redis-server --maxmemory-policy allkeys-lfu

小结一下

  • LFU 算法:最少频率使用(LFU)是一种页面置换算法,它基于数据项的访问频率来淘汰数据。LFU 算法会跟踪每个数据项的访问次数,并在需要淘汰数据时选择访问次数最少的数据。

  • 淘汰过程:当 Redis 的内存使用量达到 maxmemory 限制时,Redis 会根据 LFU 算法淘汰访问次数最少的键值对,直到内存使用量降到限制以下。

  • 近似实现:Redis 实现的 LFU 算法是一个近似版本,它通过维护一个计数器来跟踪每个键的访问频率,并在需要淘汰数据时选择访问频率最低的键。

  • 配置频率衰减:Redis 允许通过 lfu-decay-time 配置项来设置访问频率的衰减时间,这有助于平衡最近访问频率和长期访问频率的重要性。

敲黑板:注意事项

  • 数据淘汰:使用 allkeys-lfu 策略时,需要意识到那些访问频率较低的数据可能会被自动淘汰,这可能导致某些数据的丢失。

  • 性能考虑:虽然 LFU 算法可以保留重要的热点数据,但 Redis 需要维护额外的访问计数器,这可能会对性能产生一定影响。

  • 监控:建议监控 Redis 的内存使用情况和淘汰事件,以确保系统按预期工作,并及时调整策略或增加内存资源。

  • 业务适配:在决定使用 allkeys-lfu 策略之前,应考虑业务需求和数据访问模式,确保该策略与业务目标一致。

  • 算法精度:Redis 的 LFU 实现是一个近似算法,它通过定期检查一组随机键,并淘汰其中访问频率最低的键来工作。这样可以在不牺牲太多性能的情况下,近似地实现 LFU 算法。

volatile-lru

volatile-lru 是 Redis 的一种内存淘汰策略,全称为 "volatile keys least recently used"。这种策略仅针对设置了过期时间的键,基于最近最少使用算法(LRU)来淘汰数据。

适合的应用场景

  1. 缓存与过期数据:在缓存数据时,通常会为缓存项设置一个过期时间。volatile-lru 策略可以确保在内存不足时,最近最少被使用的过期键首先被移除。

  2. 临时数据存储:对于需要临时存储的数据,如会话信息或临时计算结果,这些数据通常有明确的过期时间。使用 volatile-lru 策略可以有效地管理这些临时数据。

  3. 热点数据保护:如果你希望保护那些没有设置过期时间的热点数据不被误淘汰,volatile-lru 策略可以确保只有那些即将过期的数据才会被考虑淘汰。

  4. 数据时效性:在数据具有较强时效性的场景中,如新闻文章或实时数据,使用 volatile-lru 策略可以确保旧数据在内存不足时被优先淘汰。

怎么用

  1. 配置文件设置:在 Redis 配置文件 redis.conf 中,可以通过设置 maxmemory-policy volatile-lru 来启用 volatile-lru 策略。
   maxmemory-policy volatile-lru
  1. 运行时设置:也可以在 Redis 运行时使用 CONFIG SET 命令来动态更改内存淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-lru
  1. 命令行设置:如果你使用的是 Redis 命令行工具,也可以在启动 Redis 服务时通过命令行参数设置。
   redis-server --maxmemory-policy volatile-lru

小结一下

  • LRU 算法:最近最少使用(LRU)是一种常见的页面置换算法,它基于这样一个假设:如果数据最近被访问过,那么将来被访问的几率也更高。LRU 算法会跟踪每个数据项的访问时间,并在需要淘汰数据时选择最久未被访问的数据。

  • 淘汰过程:当 Redis 的内存使用量达到 maxmemory 限制时,Redis 会根据 LRU 算法淘汰最久未被访问的设置了过期时间的键值对,直到内存使用量降到限制以下。

  • 近似实现:Redis 实现的 LRU 算法是一个近似版本,它通过定期检查一组随机键,并淘汰其中最久未被访问的键来工作。这样可以在不牺牲太多性能的情况下,近似地实现 LRU 算法。

  • 配置样本大小:Redis 允许你通过 maxmemory-samples 配置来调整用于淘汰决策的键样本大小。增加样本大小可以提高淘汰决策的准确性,但可能会增加 CPU 的使用率。

duangduangduang 注意一下

  • 数据淘汰:使用 volatile-lru 策略时,需要意识到那些最近没有被访问且即将过期的数据可能会被自动淘汰,这可能导致数据丢失。

  • 性能考虑:虽然 LRU 算法可以提高缓存命中率,但 Redis 需要维护额外的访问时间信息,这可能会对性能产生一定影响。

  • 监控:建议监控 Redis 的内存使用情况和淘汰事件,以确保系统按预期工作,并及时调整策略或增加内存资源。

  • 业务适配:在决定使用 volatile-lru 策略之前,应考虑业务需求和数据访问模式,确保该策略与业务目标一致。

  • 数据保护:如果你的应用中有重要的数据没有设置过期时间,需要注意 volatile-lru 策略不会淘汰这些数据,从而可以保护这些数据不被误淘汰。

volatile-lfu

volatile-lfu 是 Redis 的一种内存淘汰策略,全称为 "volatile keys least frequently used"。这种策略仅针对设置了过期时间的键,基于最少频率使用算法(LFU)来淘汰数据。

适合的应用场景

  1. 缓存与频率限制:在缓存数据时,如果某些数据项被访问的频率非常低,即使它们最近被访问过,也可能不是很重要。volatile-lfu 策略可以确保这些不常访问的键被优先淘汰。

  2. 临时数据存储:对于有明确过期时间的临时数据,如用户会话或缓存的API响应,volatile-lfu 策略可以在内存不足时,根据访问频率来淘汰这些临时数据。

  3. 数据时效性与访问频率:在数据具有较强时效性且访问频率不均匀的场景中,volatile-lfu 策略可以结合时效性和访问频率来决定数据的保留优先级。

  4. 热点数据与临时数据的平衡:如果你希望保护那些频繁访问的临时数据不被轻易淘汰,同时淘汰那些不常访问的临时数据,volatile-lfu 策略可以实现这种平衡。

怎么用

  1. 配置文件设置:在 Redis 配置文件 redis.conf 中,可以通过设置 maxmemory-policy volatile-lfu 来启用 volatile-lfu 策略。
   maxmemory-policy volatile-lfu
  1. 运行时设置:也可以在 Redis 运行时使用 CONFIG SET 命令来动态更改内存淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-lfu
  1. 命令行设置:如果你使用的是 Redis 命令行工具,也可以在启动 Redis 服务时通过命令行参数设置。
   redis-server --maxmemory-policy volatile-lfu

小结一下

  • LFU 算法:最少频率使用(LFU)是一种页面置换算法,它基于数据项的访问频率来淘汰数据。LFU 算法会跟踪每个数据项的访问次数,并在需要淘汰数据时选择访问次数最少的数据。

  • 淘汰过程:当 Redis 的内存使用量达到 maxmemory 限制时,Redis 会根据 LFU 算法淘汰设置了过期时间但访问次数最少的键值对,直到内存使用量降到限制以下。

  • 近似实现:Redis 实现的 LFU 算法是一个近似版本,它通过维护一个计数器来跟踪每个键的访问频率,并在需要淘汰数据时选择访问频率最低的键。

  • 配置频率衰减:Redis 允许通过 lfu-decay-time 配置项来设置访问频率的衰减时间,这有助于平衡最近访问频率和长期访问频率的重要性。

注意 注意

  • 数据淘汰:使用 volatile-lfu 策略时,需要意识到那些访问频率较低且即将过期的数据可能会被自动淘汰,这可能导致数据丢失。

  • 性能考虑:虽然 LFU 算法可以保留重要的热点数据,但 Redis 需要维护额外的访问计数器,这可能会对性能产生一定影响。

  • 监控:建议监控 Redis 的内存使用情况和淘汰事件,以确保系统按预期工作,并及时调整策略或增加内存资源。

  • 业务适配:在决定使用 volatile-lfu 策略之前,应考虑业务需求和数据访问模式,确保该策略与业务目标一致。

  • 算法精度:Redis 的 LFU 实现是一个近似算法,它通过定期检查一组随机键,并淘汰其中访问频率最低的键来工作。这样可以在不牺牲太多性能的情况下,近似地实现 LFU 算法。

volatile-random

volatile-random 是 Redis 的一种内存淘汰策略,全称为 "volatile keys random"。这种策略仅针对设置了过期时间的键,随机淘汰数据。

适合的应用场景

  1. 过期数据的不确定性:当你希望在内存不足时随机淘汰一些即将过期的数据,而不是基于访问模式或频率时,volatile-random 是一个合适的选择。

  2. 简化的淘汰逻辑:如果你不需要复杂的淘汰逻辑,而只是希望在内存压力下随机释放一些空间,那么 volatile-random 策略可以满足需求。

  3. 临时数据存储:对于存储临时数据的场景,如缓存的会话信息或临时计算结果,如果这些数据的丢失不会对系统造成重大影响,可以使用 volatile-random 策略。

  4. 避免热点数据误伤:如果你希望避免基于访问模式淘汰数据,从而可能误伤热点数据,volatile-random 策略可以提供一个更为“公平”的淘汰机制。

怎么用

  1. 配置文件设置:在 Redis 配置文件 redis.conf 中,可以通过设置 maxmemory-policy volatile-random 来启用 volatile-random 策略。
   maxmemory-policy volatile-random
  1. 运行时设置:也可以在 Redis 运行时使用 CONFIG SET 命令来动态更改内存淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-random
  1. 命令行设置:如果你使用的是 Redis 命令行工具,也可以在启动 Redis 服务时通过命令行参数设置。
   redis-server --maxmemory-policy volatile-random

小结一下

  • 随机淘汰volatile-random 策略会在达到内存限制时,从所有设置了过期时间的键中随机选择一些键进行淘汰。

  • 淘汰过程:Redis 会维护一个设置了过期时间的键的列表,当需要淘汰数据时,它会从这个列表中随机选择键来淘汰,直到内存使用量降到限制以下。

  • 简单且快速:这种策略的实现相对简单,不需要跟踪每个键的访问时间或频率,因此在执行淘汰操作时可以非常快速。

  • 公平性:由于淘汰是基于随机性的,因此这种策略在一定程度上可以认为是“公平”的,因为它不偏向于任何特定的数据。

注意

  • 数据淘汰的不确定性:使用 volatile-random 策略时,任何设置了过期时间的数据都有可能被淘汰,这可能导致一些重要的数据被意外淘汰。

  • 性能考虑:虽然随机淘汰策略的实现简单且快速,但频繁的淘汰操作可能会对性能产生一定影响,尤其是在内存使用率较高时。

  • 监控:建议监控 Redis 的内存使用情况和淘汰事件,以确保系统按预期工作,并及时调整策略或增加内存资源。

  • 业务适配:在决定使用 volatile-random 策略之前,应考虑业务需求和数据的重要性,确保该策略与业务目标一致。

  • 数据保护:如果你的应用中有重要的数据设置了过期时间,需要注意 volatile-random 策略可能会淘汰这些数据,从而需要考虑额外的数据保护措施。

allkeys-random

allkeys-random 是 Redis 的一种内存淘汰策略,全称为 "all keys random"。这种策略会在所有键中,无论是否设置了过期时间,随机淘汰数据。

适合的应用场景

  1. 无差别数据:如果你的缓存数据没有明显的访问模式差异,即所有数据的访问频率和重要性都差不多,那么 allkeys-random 可以作为一个简单的淘汰策略。

  2. 负载均衡:在分布式缓存环境中,如果所有节点的内存容量都接近上限,使用 allkeys-random 策略可以确保淘汰操作在各个节点之间相对均衡。

  3. 非关键数据:如果你缓存的数据是非关键数据,即使部分数据被随机淘汰也不会对业务造成显著影响,那么这种策略可以减少系统的复杂性。

  4. 临时解决方案:在紧急情况下,如内存泄漏或其他问题导致内存压力突然增大,allkeys-random 可以作为一个快速反应的淘汰策略。

怎么用

  1. 配置文件设置:在 Redis 配置文件 redis.conf 中,可以通过设置 maxmemory-policy allkeys-random 来启用 allkeys-random 策略。
   maxmemory-policy allkeys-random
  1. 运行时设置:也可以在 Redis 运行时使用 CONFIG SET 命令来动态更改内存淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-random
  1. 命令行设置:如果你使用的是 Redis 命令行工具,也可以在启动 Redis 服务时通过命令行参数设置。
   redis-server --maxmemory-policy allkeys-random

小结一下

  • 随机淘汰allkeys-random 策略会在达到内存限制时,从所有键中随机选择一些键进行淘汰。

  • 淘汰过程:Redis 会维护一个所有键的列表,当需要淘汰数据时,它会从这个列表中随机选择键来淘汰,直到内存使用量降到限制以下。

  • 简单且快速:这种策略的实现相对简单,不需要跟踪每个键的访问时间或频率,因此在执行淘汰操作时可以非常快速。

  • 公平性:由于淘汰是基于随机性的,因此这种策略在一定程度上可以认为是“公平”的,因为它不偏向于任何特定的数据。

注意一下

  • 数据淘汰的不确定性:使用 allkeys-random 策略时,任何数据都有可能被淘汰,这可能导致一些重要的数据被意外淘汰。

  • 性能考虑:虽然随机淘汰策略的实现简单且快速,但频繁的淘汰操作可能会对性能产生一定影响,尤其是在内存使用率较高时。

  • 监控:建议监控 Redis 的内存使用情况和淘汰事件,以确保系统按预期工作,并及时调整策略或增加内存资源。

  • 业务适配:在决定使用 allkeys-random 策略之前,应考虑业务需求和数据的重要性,确保该策略与业务目标一致。

  • 数据保护:如果你的应用中有重要的数据,需要注意 allkeys-random 策略可能会淘汰这些数据,从而需要考虑额外的数据保护措施。

volatile-ttl

volatile-ttl 是 Redis 的一种内存淘汰策略,全称为 "volatile keys with the smallest Time To Live"。这种策略仅针对设置了过期时间的键,淘汰那些剩余生存时间(TTL)最短的键。

适合的应用场景

  1. 临时数据缓存:对于那些有明确过期时间的临时数据,如会话信息、定时任务结果等,volatile-ttl 策略可以确保这些数据在内存不足时按照 TTL 顺序被清除。

  2. 数据时效性管理:在数据具有较强时效性的场景中,如新闻快讯或实时报价,volatile-ttl 策略可以确保最接近过期的数据首先被移除。

  3. 过期数据优先淘汰:如果你希望在内存不足时优先淘汰那些即将过期的数据,而不是其他数据,volatile-ttl 提供了一种直接的方式来实现这一目标。

  4. 内存优化:在内存资源有限的情况下,volatile-ttl 策略可以帮助优化内存使用,确保内存中的数据尽可能是有用的,即将过期的数据被及时清除。

怎么用

  1. 配置文件设置:在 Redis 配置文件 redis.conf 中,可以通过设置 maxmemory-policy volatile-ttl 来启用 volatile-ttl 策略。
   maxmemory-policy volatile-ttl
  1. 运行时设置:也可以在 Redis 运行时使用 CONFIG SET 命令来动态更改内存淘汰策略。
   127.0.0.1:6379> CONFIG SET maxmemory-policy volatile-ttl
  1. 命令行设置:如果你使用的是 Redis 命令行工具,也可以在启动 Redis 服务时通过命令行参数设置。
   redis-server --maxmemory-policy volatile-ttl

小结一下

  • TTL 淘汰volatile-ttl 策略会根据键的剩余生存时间来淘汰数据。Redis 会跟踪每个设置了过期时间的键的 TTL,并在需要淘汰数据时选择 TTL 最短的键。

  • 淘汰过程:当 Redis 的内存使用量达到 maxmemory 限制时,Redis 会查找所有设置了过期时间的键,并淘汰那些 TTL 最短的键,直到内存使用量降到限制以下。

  • 实时性:这种策略可以确保内存中的数据尽可能是最新的,因为它倾向于淘汰那些即将过期的数据。

  • 配置样本大小:虽然 volatile-ttl 策略不涉及 maxmemory-samples 的配置,但它仍然需要定期检查键的 TTL,以便做出淘汰决策。

要注意的情况

  • 数据淘汰的不确定性:使用 volatile-ttl 策略时,需要注意即使某些数据的 TTL 很短,它们也可能在内存不足时被保留,这取决于其他键的 TTL 值。

  • 性能考虑:虽然 TTL 淘汰策略的实现相对简单,但频繁的淘汰操作可能会对性能产生一定影响,尤其是在内存使用率较高时。

  • 监控:建议监控 Redis 的内存使用情况和淘汰事件,以确保系统按预期工作,并及时调整策略或增加内存资源。

  • 业务适配:在决定使用 volatile-ttl 策略之前,应考虑业务需求和数据的时效性,确保该策略与业务目标一致。

  • 数据保护:如果你的应用中有重要的数据设置了过期时间,需要注意 volatile-ttl 策略可能会淘汰这些数据,从而需要考虑额外的数据保护措施。

最后

以上是 V 哥整理的笔记,分享给你,欢迎关注威哥爱编程,专注技术学习与成长,绝不躺平。

相关文章
|
5天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
26 10
|
5天前
|
缓存 监控 NoSQL
Redis 缓存穿透及其应对策略
【10月更文挑战第23天】通过以上对 Redis 缓存穿透的详细阐述,我们对这一问题有了更深入的理解。在实际应用中,我们需要根据具体情况综合运用多种方法来解决缓存穿透问题,以保障系统的稳定运行和高效性能。同时,要不断关注技术的发展和变化,及时调整策略,以应对不断出现的新挑战。
21 4
|
16天前
|
存储 缓存 NoSQL
Redis Quicklist 竟让内存占用狂降50%?
【10月更文挑战第11天】
35 2
|
17天前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
24天前
|
NoSQL 算法 Redis
Redis面试篇
Redis面试篇
32 5
|
24天前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
30 1
|
5天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
22天前
|
缓存 NoSQL 算法
面试题:Redis如何实现分布式锁!
面试题:Redis如何实现分布式锁!
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
311 0
|
8天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
16 1