Redis的数据过期策略有哪些?

在redis中提供了两种数据过期删除策略。第一种是惰性删除。在设置该key过期时间后,我们不去管它。当需要该key时,我们检查其是否过期。如果过期,我们就删掉它;反之,返回该key。第二种是定期删除。就是说,每隔一段时间,我们就对一些key进行检查,并删除里面过期的key。定期清理的两种模式是:
(1)SLOW模式,是定时任务,执行频率默认为10hz,每次不超过25ms,可以通过修改配置文件redis.conf的hz选项来调整这个次数;
(2)FAST模式,执行频率不固定,每次事件循环会尝试执行,但两次间隔不低于2ms,每次耗时不超过1ms。Redis的过期删除策略是:惰性删除 + 定期删除两种策略配合使用。

<think> 我们正在讨论Redis数据过期策略。根据之前的对话历史,用户已经询问过Redis如何判断一个KEY是否过期,我们详细解释了惰性删除、定期删除等机制。现在用户的新问题是:“我想了解Redis数据过期策略有哪些”。注意,用户的问题聚焦于“有哪些策略”,因此我们需要系统性地总结Redis数据过期策略,并参考之前的引用内容。 根据引用[1][2][3],Redis数据过期策略主要包括两种: 1. 惰性删除(被动删除) 2. 定期删除(主动删除) 此外,引用[3]还提到了当内存超过maxmemory时会触发主动清理策略(即内存淘汰策略),但注意:内存淘汰策略(如LRU、LFU等)与数据过期策略是两个不同的概念,但它们在内存管理上有联系。用户的问题是“数据过期策略”,我们应聚焦于过期数据的删除策略。 因此,我们回答的核心应包括: - 惰性删除(原理、触发时机、优缺点) - 定期删除(原理、触发时机、优缺点) 同时,我们可以简要提及内存淘汰策略作为补充,但明确区分。 另外,引用[5]中详细解释了定期删除的细节(如为什么抽样的比例和停止条件),这些可以用于丰富定期删除的说明。 回答结构建议: 1. 概述Redis数据过期策略有两种:惰性删除和定期删除。 2. 分别详细说明两种策略。 3. 补充说明内存淘汰策略(因为用户可能会混淆,但需明确它不同于过期策略)。 4. 总结。 同时,根据系统指令,需要生成相关问题。 注意:引用标签的使用,在回答中引用来源的地方自然添加[^1][^2][^3][^4][^5]。 下面是回答: </think> Redis数据过期策略通过**被动删除**和**主动删除**两类机制协同工作,实现对过期 KEY 的清理。以下是核心策略详解: --- ### 一、被动删除(惰性删除)[^1][^3] - **原理**:仅在访问 KEY 时触发过期检查 - **流程**: ```mermaid graph LR A[客户端访问 KEY] --> B{检查过期时间} B -->|已过期| C[立即删除 KEY] B -->|未过期| D[返回数据] ``` - **特点**: - 零额外开销,不占用后台资源 - 实时性强,访问时立即生效 - 冷数据可能长期残留(未被访问的过期 KEY 不会被清理) --- ### 二、主动删除 #### 1. 定期删除(抽样清理)[^2][^5] - **原理**:Redis 每秒执行 10 次(默认)的后台任务 - **流程**: 1. 随机抽取 20 个设置 TTL 的 KEY 2. 删除其中已过期的 KEY 3. **循环条件**: - 若过期 KEY 比例 >25%,重复步骤 1-2 - 若执行时间 >1ms,立即终止(避免阻塞主线程) - **配置参数**(redis.conf): ```conf hz 10 # 控制每秒执行频率 ``` - **设计逻辑**: - 过期 KEY ≤1% 时跳过清理(内存影响小)[^5] - 抽样比例 1/4 作为循环阈值(确保高效清理) #### 2. 内存驱逐策略(maxmemory 触发)[^4] - **原理**:当内存超出 `maxmemory` 限制时触发 - **8 种策略**(通过 `maxmemory-policy` 配置): | 策略 | 清理逻辑 | 适用场景 | |-----------------|-----------------------------------|----------------| | `volatile-lru` | 淘汰最近最少使用的**过期 KEY** | 缓存场景 | | `volatile-ttl` | 淘汰剩余生存时间最短的 KEY | 时效性优先 | | `volatile-lfu` | 淘汰使用频率最低的**过期 KEY** | 热点数据场景 | | `allkeys-lru` | 淘汰所有 KEY 中的 LRU | 非缓存数据库 | | `allkeys-lfu` | 淘汰所有 KEY 中的 LFU | 高频访问数据 | | `volatile-random`| 随机淘汰过期 KEY | 无特殊需求 | | `allkeys-random`| 随机淘汰任意 KEY | 均匀访问场景 | | `noeviction` | 拒绝写入新数据(默认策略) | 数据不可丢失 | --- ### 三、策略协同工作流程 ```mermaid graph TD A[KEY 设置 TTL] --> B[被动删除] B -->|访问时检查| C{是否过期} C -->|是| D[立即删除] C -->|否| E[返回数据] F[定时任务] -->|每秒10次| G[定期删除] G --> H[随机抽样20个KEY] H --> I{过期比例>25%?} I -->|是| H I -->|否| J[终止本轮] K[内存超限] --> L[触发内存驱逐] L --> M[按策略清理KEY] ``` --- ### 四、技术对比与选型建议 | 策略 | 触发条件 | 优点 | 缺点 | 适用场景 | |--------------|----------------|---------------------------|---------------------|------------------------| | 惰性删除 | KEY 访问时 | 零性能开销 | 冷数据残留 | 高频访问 KEY | | 定期删除 | 后台定时任务 | 减少内存碎片 | 非实时清理 | 通用场景 | | 内存驱逐 | 内存超限时 | 防止 OOM | 可能误删未过期 KEY | 内存敏感型业务 | > 💡 **最佳实践**:生产环境推荐组合使用: > 1. 合理设置 TTL(如 `SETEX` 命令) > 2. 启用 `volatile-lfu` 内存策略(平衡时效性与性能) > 3. 调整 `hz` 参数(高频业务可增至 100)[^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值