博客
关于我
【redis键过期删除策略】很高兴再次认识你
阅读量:301 次
发布时间:2019-03-03

本文共 1827 字,大约阅读时间需要 6 分钟。

【redis键过期删除策略】很高兴再次认识你

三种删除策略

在不考虑redis实现方式的情况下,我们自己手动设计一个删除有时间限制的key有几种策略?

  • 定时删除:在创建完一个key时,同时创建一个定时任务,监听key是否过期。

  • 定期删除:设置好周期之后,间断性的扫描key,然后删除过期的key。(这里的扫描方式拓展开来也可以划分为全部扫还是随机部分扫,随机的发方式又可以怎样设计)

  • 惰性删除:联想ThreadLocal的实现方式。前两两个都是主动去做删除,那如果我喜欢被动,在条件允许的情况下,可以要用时做一个判断,if(过期)then(删除)。

redis采取的方式

再来考虑redis的实现方式,它采用定期删除惰性删除的方式。定时删除不可取,特别是在缓存的内容过期时间还都不一样的情况下。因为这会耗费更多得CPU时间,且有可能还是做无用功的耗费。(删除的时间还未到缺占着CPU)

定期删除

关于redis的定期删除,它也不对去遍历所有的key,而是分了多次去遍历redis的各个数据库中expires字典(键为我们存的key,内容为过期时间点)。遍历的进度和遍历执行的时间限制会通过如下几个全局变量保存。

/* This function has some global state in order to continue the work     * incrementally across calls. */    static unsigned int current_db = 0; /* Last DB tested. */    static int timelimit_exit = 0;      /* Time limit hit in previous call? */    static long long last_fast_cycle = 0; /* When last fast cycle ran. */

惰性删除

在实际访问到数据的时候,通过db.c#expireIfNeeded方法去判断是否过期,过期时先做删除,再执行相关命令的流程,如get操作时返回nil

int expireIfNeeded(redisDb *db, robj *key) {       if (!keyIsExpired(db,key)) return 0;    /* If we are running in the context of a slave, instead of     * evicting the expired key from the database, we return ASAP:     * the slave key expiration is controlled by the master that will     * send us synthesized DEL operations for expired keys.     *     * Still we try to return the right information to the caller,     * that is, 0 if we think the key should be still valid, 1 if     * we think the key is expired at this time. */    if (server.masterhost != NULL) return 1;    /* Delete the key */    server.stat_expiredkeys++;    propagateExpire(db,key,server.lazyfree_lazy_expire);    notifyKeyspaceEvent(NOTIFY_EXPIRED,        "expired",key,db->id);        // 这里感觉比较有趣,根据配置的策略还会选择做同步删还是异步删除    return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) :                                         dbSyncDelete(db,key);}

转载地址:http://rlxm.baihongyu.com/

你可能感兴趣的文章
NIS认证管理域中的用户
查看>>
Nitrux 3.8 发布!性能全面提升,带来非凡体验
查看>>
NiuShop开源商城系统 SQL注入漏洞复现
查看>>
NI笔试——大数加法
查看>>
NLog 自定义字段 写入 oracle
查看>>
NLog类库使用探索——详解配置
查看>>
NLP 基于kashgari和BERT实现中文命名实体识别(NER)
查看>>
NLP 模型中的偏差和公平性检测
查看>>
Vue3.0 性能提升主要是通过哪几方面体现的?
查看>>
NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
查看>>
NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
查看>>
NLP三大特征抽取器:CNN、RNN与Transformer全面解析
查看>>
NLP学习笔记:使用 Python 进行NLTK
查看>>
NLP度量指标BELU真的完美么?
查看>>
NLP的不同研究领域和最新发展的概述
查看>>
NLP的神经网络训练的新模式
查看>>
NLP采用Bert进行简单文本情感分类
查看>>
NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
查看>>
NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
查看>>
NLP:从头开始的文本矢量化方法
查看>>