【Redis教程0x08】详解Redis过期删除策略&内存淘汰策略




/* 示例代码:Redis过期键删除策略和内存淘汰策略 */
#include "redis.h"
 
void activeExpireCycle(redisDb *db, unsigned int max_loops) {
    // 迭代数据库,处理过期键
    dictEntry *de;
    int timelimit_exit = 0;
    long long start_cycle, now;
    unsigned int i, expired, num, visited;
 
    start_cycle = mstime();
    now = start_cycle;
    expired = 0;
    visited = 0;
    if (max_loops <= 0) max_loops = 1000000;
 
    for (i = 0; i < db->dict->size && max_loops--; i++) {
        // 遍历数据库中的所有键
        de = dictGetRandomKey(db->dict);
        if (de == NULL) break; /* 如果已经遍历完所有键,则退出 */
 
        // 检查键是否过期
        if (activeExpireCycleTryExpire(db,de,now)) expired++;
        if (i == 0 && mstime()-start_cycle > 1000) timelimit_exit = 1;
        visited++;
    }
 
    /* 如果达到时间限制,则下次继续从此处开始 */
    if (timelimit_exit) {
        db->active_expire_cycle = dictGetKey(de);
        return;
    }
    /* 如果没有可过期的键,则清除active_expire_cycle标志 */
    if (!expired) db->active_expire_cycle = NULL;
 
    /* 计算平均迭代次数 */
    if (visited) server.stat_expired_stale_perc = (float)expired/visited;
}
 
/* 尝试过期键 */
int activeExpireCycleTryExpire(redisDb *db, dictEntry *de, long long now) {
    int retval;
    robj *key, *val;
 
    // 获取键值对
    key = dictGetKey(de);
    val = dictGetVal(de);
 
    // 检查键是否过期
    retval = 0;
    if (val->lru <= LRU_CLOCK()) {
        retval = expireIfNeeded(db,key,val);
    }
    return retval;
}
 
/* 主动过期键 */
int expireIfNeeded(redisDb *db, robj *key, robj *val) {
    mstime_t when = val->lru - LRU_CLOCK();
 
    // 如果键已经过期,执行过期删除
    if (when <= 0) {
        propagateExpire(db,key,val);
        return dbDelete(db,key);
    }
    return 0;
}
 
/* 传播过期 */
void propagateExpire(redisDb *db, robj *key, robj *val) {
    // 发布过期事件
    redisAssertWithInfo(NULL,key,db->id == 0 && val->type == REDIS_STRING);
    redisExpire(NULL,db,key->ptr);
}
 
/* 内存淘汰策略 */
int activeExpireCycleTryAOFAndRefresh(redisDb *db, dictEntry *de, long long now, int *expired, int *freq) {
    robj *key, *val;
 
    // 获取键值对
    key = dictGetKey(de);
    val = dictGetVal(de);
 
    // 尝试根据键值对执行AOF日志同步
    if (val->type == REDIS_STRING && val->refcount == 1 &&
        /* 假设条件 */
        (now - val->lru) > 120 * REDIS_AUTOSAVE_INTERVAL)
    {
        // 执行AOF日志同步
        sds aof_
最后修改于:2024年09月04日 22:06

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日