浅谈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时间粒度

相关推荐
Patrick在香港20 分钟前
时间戳凭空早了 8 小时:datetime.utcnow() 弃用实测与漂移复盘
数据库·python·标准库·datetime·时区·弃用
深蓝AI21 分钟前
Redis 文档 MCP 揭示 Agent 检索真相:3 个工具、双读路径,引用为什么不能交给模型编
人工智能·redis
CV工程师丁Sir2 小时前
ArkWeb 手记 04|DevTools 调试与缓存清理
java·spring·缓存·harmonyos
李兆龙的博客8 小时前
问津集 #26:Lakebase——Postgres 的版本化页面存储、数据库分支与计算弹性
数据库
志尊宝10 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
倔强的石头_10 小时前
聊聊金仓KFS:一款把数据同步软件做扎实的产品
数据库
闲云野鹤在人间11 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
禾小西11 小时前
Redis:从两大维度和三大主线建立知识体系
数据库·redis·缓存
禾小西11 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
数据库小学妹12 小时前
数据共享交换平台选型:交换方式对比与避坑指南
数据库·信创·数据同步·数据交换平台·政务数据共享·数据共享交换平台·数据库底座