12人参与 • 2025-06-10 • Redis
在使用 redis 构建缓存系统时,很多开发者只设置了 expire 但却忽略了背后 redis 的过期删除机制与内存淘汰策略。理解这两者非常关键,直接关系到你的缓存系统是否高效、稳定、可控。
本文将深入剖析 redis 中的两类机制:
redis 支持给 key 设置 ttl(time to live),例如:
set user:1:name "tom" ex 60 # 设置60秒后过期
redis 有三种过期删除策略:
策略名称 | 触发方式 | 特点与代价 |
---|---|---|
惰性删除 | 访问 key 时触发 | 延迟释放内存,资源占用低,但可能滞留 |
定期删除 | 每秒扫描过期 key | 有概率清理过期 key,减缓内存膨胀 |
主动删除 | 内存不足时触发 | 与内存淘汰策略结合,主动回收 |
redis 实际如何执行过期?
redis 并不会在 key 到期的一刻立刻删除它,而是:
当 redis 达到最大内存上限(由 maxmemory 指定)时,就必须开始淘汰旧数据。此时就轮到 内存淘汰策略 发挥作用。
redis 提供的 8 种淘汰策略:
策略 | 描述 |
---|---|
noeviction | 默认策略,拒绝写入新数据,直接报错 |
allkeys-lru | 所有 key 中,淘汰最近最少使用的 |
volatile-lru | 只在设置了 ttl 的 key 中,淘汰最少使用的 |
allkeys-random | 所有 key 中,随机淘汰 |
volatile-random | 只在设置了 ttl 的 key 中,随机淘汰 |
volatile-ttl | 只淘汰 ttl 最短的 key(最早过期) |
volatile-lfu | 只在设置了 ttl 的 key 中,淘汰最少频率使用 |
allkeys-lfu | 所有 key 中,淘汰最少频率使用 |
配置示例:
maxmemory 512mb maxmemory-policy allkeys-lru
maxmemory 1gb maxmemory-policy allkeys-lru
优点:自动替换最不常访问的 key,效果最贴近缓存的预期行为
使用方式:
set user:123 "json-data" ex 300
maxmemory 1gb maxmemory-policy volatile-lru
仅淘汰设置了过期时间的 key,持久 key 不被动清除
适合混合数据结构:部分缓存 + 部分持久值
set captcha:uid123 "xyz" ex 60
结合 volatile-ttl 策略,可以优先清理即将过期的验证码等
# 配置 config set maxmemory 100kb config set maxmemory-policy allkeys-lru # 插入多个 key for i in {1..100}; do set "key$i" "$(openssl rand -hex 20)" done # 查看哪些 key 被淘汰了 info stats | grep evicted
输出示例:
evicted_keys:57
说明有 57 个 key 被自动淘汰,redis 按 lru 策略生效。
分类 | 策略类型 | 控制方式 | 推荐场景 |
---|---|---|---|
过期删除策略 | 惰性/定期 | 自动 | 所有 redis 使用 |
内存淘汰策略 | 8 种策略 | 配置项控制 | 缓存系统、高频数据 |
推荐配置模板
# 设置最大内存限制 maxmemory 512mb # 设置淘汰策略 maxmemory-policy allkeys-lru
到此这篇关于redis过期删除机制与内存淘汰策略的解析指南的文章就介绍到这了,更多相关redis过期删除与内存淘汰内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论