Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > Redis Key过期策略

Redis Key过期策略详解

作者:呼拉拉呼拉

这篇文章主要介绍了Redis Key过期策略的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

概述

Redis的Key过期策略是其内存管理系统的核心组成部分,主要包括「被动过期」、「主动过期」和「内存淘汰」三个机制。

本文将着重讲解Redis的Key过期策略,从实现原理、工作流程到最佳实践进行全面解析。

Redis Key过期策略

Redis采用多策略组合的方式管理Key过期,主要包括三种机制:定时删除惰性删除定期删除

下面将分别对这三种key过期机制进行实现原理、优缺点、Redis采用的策略、以及RDB/AOF对不同过期策略的处理上的讲解。

定时删除

实现原理:  

优点: 

缺点:  

惰性删除

实现原理:  

优点:  

缺点:  

定期删除

实现原理:  

每隔一定时间,扫描一定数量在数据库中expires字典(过期字典)中一定数量的key,并清除其中已过期的key。

工作机制  

核心算法

def activeExpireCycle():
   while True:
    # 每次随机检查20个Key
    for i in range(20):
        key = random.choice(expires_dict)
        if key.expire_time < now:
            delete_key(key)
    # 动态退出条件
    if checked_keys < 20*25%:  # 过期率<25%则退出
        break

优点:  

缺点:  

难点:  

Redis采用的策略

Redis采用**「惰性删除」** + **「定期删除」**的混合策略

「惰性删除」 + 「定期删除」策略

惰性删除流程

定期删除流程

1.遍历每个数据库(即redis.conf中配置的“database”数量,默认为16)。  

2.检查当前库中指定个数key(默认是每个库检查20个key,相当于循环执行20次)。   

注意事项

持久化对过期策略的处理

RDB对过期策略的处理

说明:过期key对RDB没有影响 

原理:  

1.从内存持久化数据到RDB文件

主节点  

从节点  

关键源码

// rdb.c 源码关键逻辑
int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val, long long expiretime) {
    if (expiretime != -1 && expiretime < mstime()) {
        return 0; // 跳过已过期的Key
    }
    // 保存未过期的Key...
}

2.从RDB文件恢复数据到内存 

全量加载流程:  

AOF对过期策略的处理

说明:过期key对AOF没有影响 

原理: 

1.从内存持久化数据到AOF文件

正常AOF追加模式  

操作类型AOF记录内容
Key设置过期PEXPIREAT key timestamp
Key自然过期DEL key(实际由propagateExpire()生成)
手动删除直接记录DEL key

AOF重写时  

与RDB的区别  

复制场景下的特殊处理

主从复制流程

节点角色过期Key处理方式
主节点惰性删除+定期删除
从节点仅依赖主节点的DEL同步

关键机制:  

数据一致性风险

场景:  

总结对比表

持久化方式生成时处理加载时处理复制传播
RDB过滤过期Key二次检查全量同步
AOF记录DEL命令按序重放增量同步
混合模式RDB部分过滤组合加载混合同步

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文