redis 的6种过期策略

本文详细介绍了Redis中关于过期键处理的六种不同策略,包括它们的工作原理及应用场景。这些策略分别是volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl以及noeviction。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis 官方提供的 conf
https://raw.github.com/antirez/redis/2.2/redis.conf
中6中过期策略的具体方式。
redis 中的默认的过期策略是volatile-lru 。设置方式   
config set maxmemory-policy volatile-lru


maxmemory-policy 六种方式
  1. volatile-lru:只对设置了过期时间的key进行LRU(默认值) 
  2. allkeys-lru : 删除lru算法的key   
  3. volatile-random:随机删除即将过期key   
  4. allkeys-random:随机删除   
  5. volatile-ttl : 删除即将过期的   
  6. noeviction : 永不过期,返回错误  
<think>我们正在讨论Redis的数据过期策略。根据引用内容,Redis主要使用两种过期策略:惰性删除和定期删除,并且通常结合使用。 引用[1]提到Redis提供了多种数据过期策略,包括定时删除、惰性删除、定期删除以及结合使用的策略,同时还提供了内存驱逐策略。 引用[2]指出Redis中主要使用定期删除+惰性删除两种数据过期清除策略。 引用[4]详细解释了惰性删除和定期删除:惰性删除是在访问key时检查是否过期,如果过期则删除;定期删除是每隔一段时间随机抽取一些key检查并删除过期的key。 另外,引用[3]提到有四种过期策略,但具体是哪四种没有明确,不过从其他引用可以总结出主要是惰性删除、定期删除以及它们的组合,再加上定时删除(但Redis实际并未使用定时删除)。 需要澄清的是,Redis实际上并没有使用定时删除(即每个key设置一个定时器,到期立即删除),因为这样会占用大量CPU资源。Redis使用的是惰性删除和定期删除两种策略。 因此,我们可以这样组织回答: 1. 介绍Redis的两种主要过期策略:惰性删除和定期删除。 2. 分别解释两种策略的工作原理、优缺点。 3. 说明Redis如何结合使用这两种策略。 4. 提到内存驱逐策略(当内存不足时,Redis会根据配置的淘汰策略删除键,但这不属于过期策略,而是内存管理策略,但相关,可以简要提及)。 同时,根据引用[4]的内容,惰性删除和定期删除的优缺点如下: 惰性删除: 优点:对CPU友好,只在访问时检查,不浪费CPU在无用的key上。 缺点:对内存不友好,如果过期key一直不被访问,就会一直占用内存。 定期删除: 优点:通过限制执行时长和频率减少对CPU的影响,同时能释放一些过期key占用的内存。 缺点:删除操作的时长和频率难以确定,如果太频繁则对CPU有影响,如果太少则可能有很多过期key未被删除。 另外,Redis还提供了内存驱逐策略(当内存达到maxmemory时触发),包括: volatile-lru, volatile-ttl, volatile-random, allkeys-lru, allkeys-random, noeviction, volatile-lfu, allkeys-lfu等。 注意:用户的问题只问“数据过期策略”,所以我们重点回答惰性删除和定期删除,内存驱逐策略可以简单提及,但不要作为过期策略。 因此,回答结构如下: 1. 惰性删除 2. 定期删除 3. 两种策略的结合 4. 补充:内存驱逐策略(简要) 最后,生成相关问题。</think>### Redis 数据过期策略详解 Redis 通过**数据过期策略**管理键值对的自动删除,确保内存高效利用。核心策略包括 **惰性删除** 和 **定期删除**,两者协同工作。以下是详细解析: --- #### 1. **惰性删除(Lazy Expiration)** - **原理**: 当客户端访问一个键时,Redis 检查该键是否过期: - 若过期 → 立即删除并返回空值。 - 若未过期 → 返回键值。 - **优点**: - **CPU 友好**:仅在访问时检查过期状态,不消耗额外计算资源[^2][^4]。 - **缺点**: - **内存浪费**:若过期键长期不被访问,会一直占用内存(内存泄漏风险)[^4]。 - **示例**: ```bash # 设置键 user:101 的过期时间为 30 秒 SET user:101 "Alice" EX 30 # 30 秒后访问 GET user:101 # 返回 nil,触发惰性删除 ``` --- #### 2. **定期删除(Periodic Expiration)** - **原理**: Redis 周期性(默认每秒 10 次)随机抽取部分键检查过期状态,删除发现的过期键。包含两种模式: - **SLOW 模式**: - 执行频率:`10 Hz`(通过 `hz` 配置调整)。 - 每次耗时:≤ `25ms`,避免阻塞主线程[^4]。 - **FAST 模式**: - 执行间隔:≥ `2ms`,每次耗时 ≤ `1ms`,用于高频清理[^4]。 - **优点**: - **平衡资源**:限制删除操作的频率和时长,减少对 CPU 的影响。 - **主动释放内存**:定期清理过期键,降低内存占用[^4]。 - **缺点**: - **参数调优难**:需根据负载调整 `hz` 参数,频率过高影响性能,过低导致内存堆积[^4]。 --- #### 3. **策略协同工作流程** Redis 结合两种策略实现高效清理: 1. **定期删除**:周期性扫描并删除部分过期键(减少内存占用)。 2. **惰性删除**:处理未被定期删除扫描到的过期键(兜底机制)。 > ⚠️ **注意**:Redis **不采用定时删除**(为每个键设置独立计时器),因大量计时器会消耗过多 CPU 资源[^1][^3]。 --- #### 4. **内存驱逐策略(补充)** 当内存不足时(即使键未过期),Redis 触发内存驱逐策略删除键,例如: - `volatile-lru`:删除最近最少使用的**过期键**。 - `allkeys-lru`:删除最近最少使用的**任意键**(含未过期键)。 - `volatile-ttl`:删除剩余存活时间最短的键。 > 通过 `maxmemory-policy` 配置启用(例如 `CONFIG SET maxmemory-policy volatile-lru`)[^1][^2]。 --- ### **总结** | **策略** | **触发条件** | 优点 | 缺点 | |----------------|---------------------|-----------------------|-----------------------| | **惰性删除** | 键被访问时 | CPU 占用低 | 内存释放不及时 | | **定期删除** | 周期性随机扫描 | 主动释放内存 | 参数调优复杂 | | **内存驱逐** | 内存不足时 | 防止内存溢出 | 可能误删未过期键 | 实际应用中,Redis 默认启用 **惰性删除 + 定期删除**,用户需根据业务需求调整 `hz`(扫描频率)和 `maxmemory-policy`(驱逐策略)[^2][^4]。 --- ### 相关问题 1. 如何配置 Redis 的定期删除频率(`hz` 参数)? 2. 内存驱逐策略 `volatile-lru` 和 `allkeys-lru` 有何区别? 3. Redis 如何处理大量键同时过期导致的内存压力? 4. 如何监控 Redis过期键的删除效率? 5. 为什么 Redis 不采用定时删除策略? [^1]: Redis 提供了多种数据过期策略,包括定时删除、惰性删除、定期删除以及结合使用的策略。同时,Redis 还提供了内存驱逐策略,在内存不足时通过不同的算法选择删除键。 [^2]: Redis中主要使用 定期删除 + 惰性删除 两种数据过期清除策略。 [^3]: 为了实现 key 的过期功能,Redis 引入了四种过期策略。 [^4]: Redis过期删除策略:惰性删除+定期删除两种策略进行配合使用。惰性删除对CPU友好但可能不释放内存;定期删除可主动释放内存但需平衡频率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值