• redis 过期策略分析


    因为我们都知道redis 是基于内存的,而系统的内存是有限的,那么问题来了?

    既然内存是有限的,比如redis就只给分配了10G的内存,你却要往里硬怼20G的数据,会咋办?毫无疑问,当然会被干掉10G的数据了,

    那问题又来了,干掉拿些数据呢?又保留哪些数据?我们当然希望干掉那些不常用的,保留常用的数据了。

    所以这是缓存的一种基本的概念,要么我们自己设置过期时间,要么在满足某些条件下redis帮我们直接干掉。

    如果自己设置了过期时间,那你知道Redis是怎么给你弄过期的吗?又是什么时候被删除的?
    比如我们在set key时可以给定一个expire time就是过期时间,比如指定这个key的过期时间为1小时?10分钟? 这个很有用的,我们自己控制缓存的存活时间。
    假如你设置了一批key只能存活1小时,那么一小时后,Redis是如何对这一批key进行删除的呢?

    解决办法:定期删除+惰性删除

    定期删除:指的是Redis默认会每隔一定时间(默认100ms)就会抽取一批设置了过期时间的key来检测是否过期,过期就删除。假设你Redis存放了100万key都设置了过期时间,你每隔几百毫秒,就检查100万key,那Reids基本就挂了, cup负载会飙升,都消耗在你检测过期key上了。
    注意:这里可不是每隔100ms就遍历所有的设置了过期的key,那样将是一场性能上的灾难。实际上Redis是每隔100ms随机的抽取一部分设置过期时间的key来检测和删除。

    定期删除存在一个问题:定期删除可能会导致一部分过期了的key时间到了却并没有被删除,哪怎么办呢?别着急,这就该我们的惰性删除登场了。

    惰性删除:就是你在获取某个Key时Redis会先检测一下,这个key是否设置了过期时间?如果设置了过期时间那么是否过期?过期就删除。

    即使是定期删除和惰性删除也存在一定的问题,如定期删除漏掉了很多过期的key,然后也没及时的去查也就没有走惰性删除,此时会怎么样?大批的过期key躺在内存了,导致Redis内存很快别被耗尽,怎么办呢?

    解决办法:这个时候就是内存淘汰机制起作用了

    几种淘汰策略:

    • noeviction: 当内存不足以容纳新写入的数据时,新写入数据时会报错。这个一般不会有人使用,感觉太坑人了
    • allkeys-lru:当内存不足以容纳新写入的数据时,在键空间中,移除最近最少使用的key。(这也是我们经常使用的策略)
    • allkes-random:当内存不足以容纳新写入的数据时,在键空间中,随机移除某个key。(这个正常人都不会使用吧,为啥要随机?肯定移除最近最少使用的key呀)
    • volatile-lru:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,移除最近最少使用的key。(这个一般也不太合适)
    • volatile-random:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,随机移除某个key。
    • volatile-ttl:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。(这个也不合理)
  • 相关阅读:
    数据库连接池使用(一):使用C#数据库连接池
    开包即食的教程带你浅尝最新开源的C# Web引擎Blazor
    HTTP协议之内容协商
    浅谈Cookie、Session与Cache的区别
    应用程序框架(一):DDD分层架构:领域实体(基础篇)
    持续集成是什么?
    Git版本控制 Git、github,gitlab相关操作
    Spring-Cloud-Netflix-Ribbon&Feigen
    Spring-Cloud-Netflix-Eureka集群搭建
    java面试题-javaSE基础
  • 原文地址:https://www.cnblogs.com/fangdada/p/14943010.html
Copyright © 2020-2023  润新知