阿里面试让聊一聊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 哥整理的笔记,分享给你,欢迎关注威哥爱编程,专注技术学习与成长,绝不躺平。

相关文章
|
24天前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
6天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
6天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
4天前
|
SQL 关系型数据库 MySQL
阿里面试:1000万级大表, 如何 加索引?
45岁老架构师尼恩在其读者交流群中分享了如何在生产环境中给大表加索引的方法。文章详细介绍了两种索引构建方式:在线模式(Online DDL)和离线模式(Offline DDL),并深入探讨了 MySQL 5.6.7 之前的“影子策略”和 pt-online-schema-change 方案,以及 MySQL 5.6.7 之后的内部 Online DDL 特性。通过这些方法,可以有效地减少 DDL 操作对业务的影响,确保数据的一致性和完整性。尼恩还提供了大量面试题和解决方案,帮助读者在面试中充分展示技术实力。
|
6天前
|
存储 分布式计算 算法
1GB内存挑战:高效处理40亿QQ号的策略
在面对如何处理40亿个QQ号仅用1GB内存的难题时,我们需要采用一些高效的数据结构和算法来优化内存使用。这个问题涉及到数据存储、查询和处理等多个方面,本文将分享一些实用的技术策略,帮助你在有限的内存资源下处理大规模数据集。
15 1
|
8天前
|
存储 监控 Java
深入理解计算机内存管理:优化策略与实践
深入理解计算机内存管理:优化策略与实践
|
30天前
|
消息中间件 存储 canal
阿里面试:canal+MQ,会有乱序的问题吗?
本文详细探讨了在阿里面试中常见的问题——“canal+MQ,会有乱序的问题吗?”以及如何保证RocketMQ消息有序。文章首先介绍了消息有序的基本概念,包括全局有序和局部有序,并分析了RocketMQ中实现消息有序的方法。接着,针对canal+MQ的场景,讨论了如何通过配置`canal.mq.partitionsNum`和`canal.mq.partitionHash`来保证数据同步的有序性。最后,提供了多个与MQ相关的面试题及解决方案,帮助读者更好地准备面试,提升技术水平。
阿里面试:canal+MQ,会有乱序的问题吗?
|
26天前
|
消息中间件 架构师 Java
阿里面试:秒杀的分布式事务, 是如何设计的?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试阿里、滴滴、极兔等一线互联网企业时,遇到了许多关于分布式事务的重要面试题。为了帮助大家更好地应对这些面试题,尼恩进行了系统化的梳理,详细介绍了Seata和RocketMQ事务消息的结合,以及如何实现强弱结合型事务。文章还提供了分布式事务的标准面试答案,并推荐了《尼恩Java面试宝典PDF》等资源,帮助大家在面试中脱颖而出。
|
27天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
67 1
|
29天前
|
存储 缓存 NoSQL
Redis Quicklist 竟让内存占用狂降50%?
【10月更文挑战第11天】
40 2