Redis过期键删除策略和内存淘汰策略

 我来答
没文化的大脑袋CU
2022-07-22 · TA获得超过2695个赞
知道小有建树答主
回答量:556
采纳率:100%
帮助的人:78.8万
展开全部
    惰性删除+定期删除

    键过期后并不会立即删除,而是等到使用它时,先判断该键是否已经过期,如果过期则删除

    对内存不友好,对CPU友好

    redis每隔一段时间随机检测一部分数据(并不是全部)是否过期,如果已过期则删除

    redis.conf中的hz参数用来配置每秒执行几次定期删除,默认值是10,即100ms/次

    redis.conf中的maxmemory-samples参数用来指定每次检测几条数据,默认5

    对CPU不友好,对内存友好

    redis.conf中的maxmemory参数配置了redis的最大内存,maxmemory-policy配置了内存淘汰策略,当redis内存达到最大后,会根据内存淘汰策略淘汰部分数据。

    redis提供了8种内存淘汰策略:

        no-eviction:当内存达到最大后,新数据不能写入,会报错

        allkeys-lru:当内存达到最大后,淘汰最近最少使用的数据(最常用的策略)

        allkeys-random:当内存达到最大后,随机淘汰

        allkeys-lfu:当内存达到最大后,淘汰最少使用的数据

        volatitle-lru:当内存达到最大后,从设置了过期键的数据中,淘汰最近最少使用的数据

        volatitle-random:当内存达到最大后,从设置了过期键的数据中,随机淘汰

        volatitle-lfu:当内存达到最大后,从设置了过期键的数据中,淘汰最少使用的数据

        volatitle-ttl:当内存达到最大后,淘汰最早过期的数据

    标准的LRU算法需要维护一个链表,当某个数据被使用时就把它放到链表头部,这样就保证了链表是按照使用时间排序的,当需要淘汰数据时,就从链表尾部删除部分数据。

    标准LRU算法要进行大量的计算,redis采取了近似LRU算法的操作。

    redis给每个键维护了一个24bit的属性字段,用来记录最后一次使用的时间戳。redis根据maxmemory-samples随机抽取一部分数据,将最旧的数据淘汰,指到内存降下来。后来redis又引入了淘汰池,淘汰池内的数据量等于maxmemory-samples,每次淘汰时将随机抽取的数据和淘汰池中的数据合并,淘汰最旧的数据,然后将剩余最旧的数据维护到淘汰池中,等待下次循环。

    为什么需要LFU算法?

    现在假设这种场景:redis中有两个键A和B,其使用频率如上面所示,当到达$时,因为A的使用时间比B晚,按照LRU算法会淘汰B,但是从使用频率上看,B明显比A使用的更频发,应该淘汰A。

    为了解决上面的问题,Redis引入了LFU算法,淘汰最少使用的数据。原理如下:

    LFU给每个数据维护了一个计数器,每次使用都会使计数器增加,淘汰使用次数最少的键。但是这样又有新的问题:

    ①新的key如果计数器为0,可能就会一直被淘汰

            redis解决方案:redis给每个新的键的计数器一个初始值

    ②某个键可能前一段时间被频繁使用,但是一段时间后使用频率就会下降。

            redis解决方案:如果某个键一段时间不使用,计数器会减小

  
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
大雅新科技有限公司
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,... 点击进入详情页
本回答由大雅新科技有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式