Redis过期键的删除策略有哪些?

更多面试题请看这里:https://interview.raoyunsoft.com/

面试题专栏会持续更新欢迎关注订阅

Redis 通过三种策略管理过期键的清理,确保内存高效利用并平衡性能:

1. 定时删除(主动删除)
  • 机制:为每个键设置过期时间时,同时创建一个定时器(Timer)。当键过期时立即触发删除操作。
  • 优点:内存释放及时,避免内存浪费。
  • 缺点 :
    • 大量定时器消耗CPU资源,影响吞吐量。
    • 频繁创建/销毁定时器增加系统开销。
  • 适用场景:对内存敏感但CPU资源充足的场景。
2. 惰性删除(被动删除)
  • 机制:不主动清理过期键,仅在访问键时检查过期状态。若已过期则删除并返回空值;未过期则正常返回数据。
  • 优点 :
    • CPU开销极低,只在访问时触发检查。
    • 实现简单,无额外后台任务。
  • 缺点 :
    • 内存释放不及时,长期未访问的过期键会占用内存(内存泄漏风险)。
  • 典型场景 :GET、HGET等读操作触发检查。
python 复制代码
# 伪代码示例:惰性删除流程
def get_key(key):
    if key in redis_db:
        if is_expired(key):  # 检查过期时间
            delete_key(key)  # 删除过期键
            return None
        else:
            return redis_db[key]
    return None
3. 定期删除(折中策略)
  • 机制:周期性扫描数据库(默认每秒10次),每次随机抽取部分键检查过期状态并批量删除。
  • 流程控制 :
    • 限制每次扫描的时长和数量,避免阻塞主线程。
    • 通过算法动态调整扫描频率(如根据过期键比例)。
  • 优点 :
    • 平衡内存和CPU:减少惰性删除的内存泄漏,避免定时删除的CPU峰值。
  • 缺点 :
    • 时效性不如定时删除,可能短暂残留过期键。
graph TD A[启动定期删除任务] --> B[随机选择20个键] B --> C{检查是否过期?} C -->|是| D[删除键] C -->|否| E[跳过] D --> F{本轮删除键数量≥25%?} E --> F F -->|是| B[继续本轮扫描] F -->|否| G[结束本轮任务]
Redis 的实际策略组合

Redis 默认采用「惰性删除 + 定期删除」组合:

  1. 读写时触发惰性删除,保证基础性能。
  2. 定期删除补充清理 (通过hz参数调整频率),防止内存堆积。
  3. 定时删除仅用于特殊场景 (如SET key value EX的原子操作)。

⚠️ 注意 :若大量键集中过期(如缓存雪崩),定期删除可能无法及时清理,需结合maxmemory-policy(如LRU)避免OOM。

相关推荐
笃行35020 分钟前
金仓 KingbaseES PL/SQL 开发全攻略:异常处理、数据类型、调试优化与过程语句
数据库
快乐的木子李1 小时前
mysql-26.7.0-linux26.7.0下载安装
数据库·mysql
现任明教教主~2 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
excel2 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
知行产研3 小时前
易控智驾:毛利率跃升17.2个百分点,矿山无人驾驶从“规模换增长“迈入“盈利拐点“
数据库·mysql
一条破秋裤3 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
千里码aicood3 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
布吉岛的石头3 小时前
Java 程序员第 49 阶段5:BERT 预训练目标 MLM+NSP 的工程含义
java·人工智能·深度学习·bert·transformer
饺子大魔王的男人3 小时前
Redis 内存和连接异常怎么排查?用 redis_exporter 搭一套可远程抓取的监控链路
数据库·redis·bootstrap
可涵不会debug3 小时前
第一次学 LangGraph:用一个快递案例搞懂 State、Node、Edge 和 compile
服务器·数据库·mysql