大家好,我是 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 哥整理的笔记,分享给你,欢迎关注威哥爱编程,专注技术学习与成长,绝不躺平。

阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略的更多相关文章

  1. Redis的内存淘汰策略

    Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 ...

  2. Redis 内存满了怎么办? Redis的内存淘汰策略

    https://juejin.im/post/5d674ac2e51d4557ca7fdd70 Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限, ...

  3. Redis的内存淘汰

    Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 ...

  4. Redis的内存淘汰策略(八)

    一:Redis的AOF是什么? 以日志的形式来记录每个写操作(读操作不记录),将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构 ...

  5. Redis实战 内存淘汰机制

    http://blog.720ui.com/2016/redis_action_02_maxmemory_policy/#volatile-lru 文章目录 1. 如何配置 2. 动态改配置命令 2. ...

  6. Redis系列--内存淘汰机制(含单机版内存优化建议)

    https://blog.csdn.net/Jack__Frost/article/details/72478400?locationNum=13&fps=1 每台redis的服务器的内存都是 ...

  7. redis六种内存淘汰策略学习

    当客户端会发起需要更多内存的申请,Redis检查内存使用情况,如果实际使用内存已经超出maxmemory,Redis就会根据用户配置的淘汰策略选出无用的key; 当前Redis3.0版本支持的淘汰策略 ...

  8. 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...

  9. Redis的过期策略和内存淘汰策略(转)

    Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间.Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理. ...

  10. Redis的过期策略和内存淘汰策略

    Redis的过期策略:通常有三种,Redis中同时使用惰性过期和定期过期两种过期策略组合. 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据 ...

随机推荐

  1. [rCore学习笔记 016]实现应用程序

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 设计方 ...

  2. Node.js 处理 File

    Node.js 处理 File fs 模块 常规使用 运用递归遍历目录树 创建文件和目录 读写文件 path 模块 对于 file 的理解,此处 fs 模块 Node.js 提供了处理文件系统的内置模 ...

  3. 如何让 MGR 不从 Primary 节点克隆数据?

    问题 MGR 中,新节点在加入时,为了与组内其它节点的数据保持一致,它会首先经历一个分布式恢复阶段.在这个阶段,新节点会随机选择组内一个节点(Donor)来同步差异数据. 在 MySQL 8.0.17 ...

  4. DASCTF 2023六月挑战赛|二进制专项 PWN (下)

    DASCTF 2023六月挑战赛|二进制专项 PWN (下) 1.can_you_find_me 检查保护 意料之中 64位ida逆向 只有add,和del功能不能show 先看add吧 最多申请10 ...

  5. java中使用jdbc连接数据库操作

    先贴代码,在做说明 import java.sql.*; import java.util.ArrayList; import java.util.List; public class Conn { ...

  6. java spring boot 2 开发实战 mybtis 基础部份从搭建到第一个完整测试(从环境到测试用例二部份)

    本案例是java  sping boot  2.2.1 mybtis 基础部份 第一步搭建环境:安装依赖 由于我们公司项目是1.8 环境不能乱,我现在自己的电脑是1.8环境,所以本次整理的boot 代 ...

  7. android常用布局基础学习

    总结:可水平放置可垂直放置也可穿插使用,默认为水平 <!--我在第一次使用权重的时候忽视了本线性布局中的宽度与高度,如果要使用权重,请将线性布局的最初大小设置为match_parent,否则不会 ...

  8. fragment的查找和移除

    FragmentManager fragmentmanger = getSupportFragmentManager(); FragmentTransaction fragmenttransactio ...

  9. LeetCode654. 最大二叉树

    题目链接:https://leetcode.cn/problems/maximum-binary-tree/description/ 题目叙述 给定一个不重复的整数数组 nums . 最大二叉树 可以 ...

  10. ComfyUI插件:ComfyUI layer style 节点(二)

    前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点.该节点几乎将PhotoShop的全部功能迁移到Comf ...