Redis中key过期和删除及淘汰策略

1.1 过期 key

1.1.1 常用过期删除策略

  • 定时删除 :给每个 key 添加定时任务(或者使用全局 定时任务) 来删除过期的 key 【Redis中没有使用】
  • 惰性删除 : 客户端访问 key 的时候再去判断 key 是否过期,若过期则删除【内部策略,无需配置】
  • 定期删除 :定期过期策略会周期性地执行过期 key 扫描逻辑,并将扫描到的过期 key 清理掉, 可以设置扫描耗时的上限,避免影响正常的功能 Redis使用 惰性过期和定期过期两种策略

1.1.2 定期删除策略描述

Redis 默认会每秒进行 10 次扫描,过期扫描不会遍历过期字典中所有的 key

  • 从过期字典中随机 20 个 key
  • 删除这 20 个 key 中已经过期的 key
  • 如果过期的 key 比率超过 1/4,则重复上述步骤

1.1.3 定期删除策略配置

redis.conf 中可以通过修改 hz 配置来控制删除的频率, 对该配置到描述可以参考 Redis 官网给的 Redis configuration file example, 下面贴出来这个文件和 hz 配置相关的部分, 可以先看一下对 hz 参数的解释

Redis 的配置文件中,hz参数是一个重要的配置项,它表示 Redis 服务器每秒钟执行定时器的频率,单位是次/秒。这个参数主要影响 Redis 对过期 key 的删除策略。 具体来说,hz 参数决定了 Redis 检查并删除过期 key 的频率。当 hz 的值较大时,Redis 会更频繁地检查并删除过期 key,从而保持内存的清洁和高效利用。然而,这也意味着 Redis 会消耗更多的 CPU 资源来执行这些检查和删除操作。因此,需要根据服务器的实际情况来合理配置hz的值,以在内存使用和 CPU 资源之间达到良好的平衡

conf 复制代码
# Redis calls an internal function to perform many background tasks, like
# closing connections of clients in timeout, purging expired keys that are
# never requested, and so forth.
#
# Not all tasks are performed with the same frequency, but Redis checks for
# tasks to perform according to the specified "hz" value.
#
# By default "hz" is set to 10. Raising the value will use more CPU when
# Redis is idle, but at the same time will make Redis more responsive when
# there are many keys expiring at the same time, and timeouts may be
# handled with more precision.
#
# The range is between 1 and 500, however a value over 100 is usually not
# a good idea. Most users should use the default of 10 and raise this up to
# 100 only in environments where very low latency is required.
hz 10

# Normally it is useful to have an HZ value which is proportional to the
# number of clients connected. This is useful in order, for instance, to
# avoid too many clients are processed for each background task invocation
# in order to avoid latency spikes.
#
# Since the default HZ value by default is conservatively set to 10, Redis
# offers, and enables by default, the ability to use an adaptive HZ value
# which will temporarily raise when there are many connected clients.
#
# When dynamic HZ is enabled, the actual configured HZ will be used
# as a baseline, but multiples of the configured HZ value will be actually
# used as needed once more clients are connected. In this way an idle
# instance will use very little CPU time while a busy instance will be
# more responsive.
dynamic-hz yes
  • 根据官网给出的配置示例,该值在 1-500 之间,不过不建议将值设置的超过 100
  • 如果配置了 dynamic-hz yes, 那么 hz 的值只是基准值,可能会根据实际情况动态改变

1.2 内存淘汰策略

1.3 1.什么是内存淘汰策略

  • redis.confmaxmemory 配置项指定了 Redis 的最大内存(单位是 byte )
  • Redis 内存达到设置的值时,就会按照 配置的内存淘汰策略 删除 key

1.3.1 内存淘汰策略有哪些

Redis 的内存淘汰策略可以通过 redis.conf 文件中的 maxmemory-policy 配置指定,具体有以下几种策略

  • no-envictionRedisServer 不会主动删除 key,对 key 的增、改操作会报错,删、查操作可正常响应
  • 接下来的这些策略是对设置了过期时间key 进行删除
    • volatile-lru:[[LRU算法]]
      • Redis 会按照近似 LRU 的算法,从设置了过期时间的 key 中,选取 key 进行淘汰
      • 之所以说近似是因为每次只会选择部分过期的 key,然后删除最近没有访问的 key,这样可以避免遍历所有过期的 key
    • volatile-random
      • 从设置了过期时间的 Key 中随机选择 Key 进行淘汰
    • volatile-ttl
      • 从设置了过期时间的 Key 中筛选将要过期的 Key 进行淘汰
    • volatile-lfu [[LFU算法]]
      • 使用近似 LFU 算法从设置了过期时间的 Key 中,筛选出最近访问频率最低的 Key 进行淘汰
  • 接下来的这些策略是对所有 key 进行选择删除
    • allkeys-lru
      • 使用近似 LRU 算法,筛选 Key 的范围是 Redis 内全部的 Key
    • allkeys-random
      • 从所有 Key 中随机选择 Key 进行淘汰
    • allkeys-lfu
      • 使用近似 LFU 算法从全部 Key 中,筛选出最近访问频率最低的 Key 进行淘汰
相关推荐
秋意钟14 分钟前
缓存雪崩、缓存穿透【Redis】
redis
简 洁 冬冬27 分钟前
046 购物车
redis·购物车
Iced_Sheep33 分钟前
干掉 if else 之策略模式
后端·设计模式
XINGTECODE1 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
soulteary1 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
凡人的AI工具箱1 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
先天牛马圣体2 小时前
如何提升大型AI模型的智能水平
后端
java亮小白19972 小时前
Spring循环依赖如何解决的?
java·后端·spring