怎样防止Redis热点数据被误删除_结合volatile-lru与手动过期设置

雨晨大大_7769

雨晨大大_7769

2026-06-02

240人浏览

原创

volatile-lru不保护热点数据,仅对带过期时间的key按最近最少使用原则驱逐,无法识别真实热度;需通过懒刷新、ttl动态延长、访问标记及内存隔离等手段主动保障热点key。

怎样防止redis热点数据被误删除_结合volatile-lru与手动过期设置

volatile-lru 本身不保护热点数据,它只决定“删谁”

volatile-lru 策略仅对设置了过期时间(EXPIRE 或 SETEX)的 key 生效,且在内存不足时,按“最近最少使用”逻辑驱逐——但这里的“使用”指被读/写访问,而非业务意义上的“热点”。一个高频读但刚被访问过的 key,在 LRU 队列里位置靠前;而一个低频但长期未被触碰的过期 key,反而更可能被淘汰。所以它无法感知真实热度,更不会“避开”热点。

常见错误现象:volatile-lru 配置下,缓存命中率突然下跌,监控显示大量 evicted_keys 增长,但业务日志里对应 key 的 GET 请求其实非常密集。

  • 根本原因:LRU 是基于访问时间戳的线性队列,不是热度计数器;一次突发访问就把 key 拉到队尾,下次 GC 可能就轮不到它,但下一轮流量高峰来临时它已不在了
  • 不要指望靠调大 maxmemory 或降低淘汰频率来“缓解”——只要存在内存压力,LRU 就会按规则清,不讲业务优先级
  • 该策略适合场景:缓存层作为纯“暂存+自动过期”用途,且所有 key 的生命周期和访问模式相对均匀(如 session、临时 token)

手动设置过期时间必须配合访问刷新,否则等于没设

单纯用 SET key value EX 3600 设置固定 TTL,对热点 key 来说就是埋雷:一旦过期时间一到,key 立刻消失,不管它是否正在被高频访问。真正有效的做法是“懒刷新”——每次成功读取后,重置过期时间。

抖音实时热点榜
抖音实时热点榜

每小时追踪抖音热榜,抖音实时热点榜从创作者视角拆爆款、挖选题、预判趋势。

下载
  • 推荐组合:GET + EXPIRE(非事务)或 EVAL 脚本原子执行
  • 示例脚本(防止并发重置):
    EVAL "if redis.call('GET', KEYS[1]) then redis.call('EXPIRE', KEYS[1], ARGV[1]) return 1 else return 0 end" 1 my:hot:key 7200
  • 注意 EXPIRE 返回值:返回 1 表示成功设置(key 存在且未过期),0 表示 key 不存在或已过期——需据此判断是否要回源重建
  • 避免在写操作中盲目 EXPIRE:比如 SET 后立刻 EXPIRE,会导致写放大;应只在读路径中对确认存在的热点 key 刷新

真正防误删的三层补丁:TTL 延长 + 访问标记 + 内存隔离

单靠策略或单次刷新不够稳定。生产中建议叠加三类控制:

  • TTL 动态延长:对访问频次 > 100qps 的 key,每次刷新时把 EXPIRE 时间从 3600 秒逐步加到 7200 秒,上限封顶(比如 28800),避免无限续命拖垮内存
  • 访问标记机制:用 INCR hot_flag:my:hot:key 统计短期访问次数,配合定时任务扫描 hot_flag:*,对高分 key 主动 PEXPIRE 延长毫秒级 TTL,绕过 LRU 队列干扰
  • 内存硬隔离:为明确的热点 key 集合(如商品 ID 白名单)单独部署一个小 Redis 实例,配置 noeviction,彻底禁用淘汰;代价是运维成本上升,但关键路径零风险

volatile-lru 和手动过期混用时最易踩的坑

很多人以为“开了 volatile-lru + 所有 key 都设了 EXPIRE”就万事大吉,结果线上出问题才意识到细节反直觉:

  • EXPIRE 对已过期 key 无效,且不报错;若读取时 key 刚过期被清理,EXPIRE 返回 0,但业务代码没判断,后续就直接空缓存穿透
  • volatile-lru 下,未设置过期时间的 key 永远不会被淘汰,但也不会被 LRU 管理——如果误存了大量永久 key,会悄悄吃光内存,触发 OOM killer
  • Redis 7.0+ 引入 LFU 模式(volatile-lfu),比 LRU 更适配热点场景,但 LFU 计数有衰减,默认 1 分钟无访问就降权,仍需配合刷新,不能替代业务层热度识别

真正关键的不是策略选型,而是让 Redis 知道“哪些 key 绝对不能丢”——这只能靠业务代码在读写路径中显式表达,而不是寄希望于淘汰算法自动理解。

相关专题

更多
c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.23

694

12

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4249

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3755

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6752

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

736

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6322

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1140

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1016

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习