浅谈Redis(2)

一.提出问题

当我们给 Redis 海量 Key 设置了过期时间,Redis 如何感知哪些 Key 已过期、需要回收,哪些仍在有效期?Redis 通过过期键删除策略管理过期数据,官方采用「惰性删除 + 定期删除」组合方案实现过期键清理。

二.redis的过期策略

1.惰性删除(被动删除)

当redis中某个键过期了,不会立刻被删除,等到下一次,客户端访问这个键时,redis会先检验过期状态,若已过期当场删除,再返回空数据

  • 优点:CPU 开销极小,仅在访问时触发检查,闲置 CPU 无无效扫描
  • 缺点:内存浪费风险大。若过期 Key 长期不再被访问,会永久驻留内存,成为僵尸数据

2.定时删除

设置固定周期(默认 100ms),每隔这个时间就从 Redis 里随机抽取指定数量的键,挨个检查是否过期,查到过期键就直接删除

优点:主动释放过期内存,规避惰性删除长期堆积过期 Key 的问题

缺点:Redis 只做抽样抽查,海量过期 Key 可能单次扫不完

并不是采取某一种策略,而是两种策略结合使用

三.使用定时任器删除过期键

1.使用优先级队列

**思路:**创建一个优先级队列 (过期时间早的,优先级高),将被设置了过期时间的键,按照优先级顺序依次放入优先级队列中,最先过期的键放置在队首。定时器开启一个线程只扫描队首的键是否过期(队首是全队列最先过期的数据,队首没到期,队列里剩下所有键都没过期);如果键过期就出队删除,原第二位的键变成新队首,循环处理;没到过期时间,就根据当前时间和队首过期时间算出休眠时长,线程休眠,避免频繁空扫描浪费 CPU,等到休眠结束唤醒线程,再次校验队首。

2.使用时间轮

指针每转到一格,就遍历当前格子链表,删除里面所有过期Key

补充:(1)如果 key 过期时间超过单圈总时长,就挂载多圈标记,指针多转几圈后再处理。

**(2)**单个格子代表100ms时间粒度

相关推荐
qq_401700413 小时前
Qt Modbus 工程化封装:超时、重试、取消与资源释放,别让异步请求变成隐患
数据库·qt
ESDWAN3 小时前
SD-WAN 是什么?工作原理、适用场景与选型要点
开发语言·网络·数据库·架构·php
m0_639906943 小时前
MySQL 慢查询优化|explain执行计划详解
数据库·mysql
正儿八经的少年3 小时前
MyBatis 一对一、一对多 SQL
数据库·sql·mybatis
Elastic 中国社区官方博客3 小时前
Elastic 在《Forrester Wave™:2026 年第四季度智能运维平台》报告中被评为强劲表现者
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
Apache IoTDB4 小时前
从 IoTDB 到 CED-DB:哈尔滨工业大学探索云边端协同时序数据库
数据库·时序数据库·iotdb
闲云野鹤在人间4 小时前
头秃修炼手册:StorageClass+StatefulSet+ETCD 全套渡劫笔记
linux·数据库·笔记·云原生·kubernetes·etcd
Geek-Chow4 小时前
06 · DeepSeek V4.1 Flash 推理端到端走查:一个 Agent 请求穿过 recipe、KV 缓存、Prefill 与 Decode
缓存
前进的李工4 小时前
Agent 学习笔记 04:KV Cache 与上下文缓存
笔记·学习·缓存·agent·注意力机制·kv cache·prompt cache
Decay__4 小时前
03_MySQL 存储引擎与存储管理 —— InnoDB 深入、表空间/ibd、binlog/redo/undo 与双写缓冲
运维·数据库·sql·mysql·架构