美文网首页
redis入门(六)Key过期,内存淘汰机制

redis入门(六)Key过期,内存淘汰机制

作者: hlchengzi | 来源:发表于2019-07-30 11:41 被阅读0次

    通过EXPIRE key seconds命令来设置数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间。在key上设置了过期时间后key将在指定的秒数后被自动删除。被指定了过期时间的key在Redis中被称为是不稳定的。

    Redis key过期的方式有三种:

    1,惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key(无法保证冷数据被及时删掉)
    2,定期删除:Redis会定期主动淘汰一批已过期的key(随机抽取一批key检查)
    3,内存淘汰机制:当前已用内存超过maxmemory限定时,触发主动清理策略

    Redis密钥以两种方式过期:被动方式和主动方式。

    惰性删除
    当某个客户端尝试访问密钥时,密钥被动过期,并且密钥被发现超时。(惰性删除)
    
    定期删除
    当然这还不够,因为有过期的密钥永远不会被再次访问。这些密钥无论如何都应该过期,所以周期性地Redis会在具有过期集的密钥中随机测试几个密钥。已经过期的所有密钥都将从密钥空间中删除。
    具体来说,这就是Redis每秒做10次的事情:
    从具有相关过期的密钥集中测试20个随机密钥。
    删除找到的所有密钥已过期。
    如果超过25%的密钥已过期,请从步骤1重新开始。
    这是一个简单的概率算法,基本上假设我们的样本代表整个密钥空间,我们继续到期,直到可能过期的密钥百分比低于25%
    这意味着在任何给定时刻,使用内存的已经过期的最大键数量最大等于每秒最大写入操作量除以4。
    
    redis 内存淘汰机制:

    redis有6中淘汰机制,如下

    noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。
    allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(常用)。
    allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。
    volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
    volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
    volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
    

    RDB,AOF复制过程中对过期键的处理

    RDB复制过程中对过期键的处理

    在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。
    数据库中包含过期键不会对生成新的RDB文件造成影响。

    在启动数据库的时候,如果redis开启了RDB功能
    A: 如果服务器以主服务器模式运行,那么在载入RDB文件时,程序会对文件中保存的键进行检查,未过期的
    键会被载入到数据库中,而过期键则会被忽略,所以过期键对载入RDB文件的主服务器不会造成影响;
    B: 如果服务器以从服务器模式运行,那么在载入RDB文件时,文件中保存的所有键,不论是否过期,都会被 载入到数据库中。不过,因为主从服务器在进行数据同步的时候,从服务器的数据库就会被清空,所以一般来讲,过期键对载入RDB文件的从服务器也不会造成影响;

    AOF复制过程中对过期键的处理

    当服务器以AOF持久化模式运行时,如果数据库中的某个键已经过期,但它还没有被惰性删除或者定期删除,那么AOF文件不会因为这个过期键而产生任何影响

    当过期键被惰性删除或者定期删除之后,程序会向AOF文件追加(append)一条DEL命令,来显式地记录该键已被删除。
    举个例子,如果客户端使用GET message命令,试图访问过期的message键,那么服务器将执行以下三个动作:
    1)从数据库中删除message键。
    2)追加一条DEL message命令到AOF文件。(根据AOF文件增加的特点,AOF只有在客户端进行请求的时候才会有这个DEL操作)
    3)向执行GET命令的客户端返回空回复。
    

    AOF重写

    和生成RDB文件时类似,在执行AOF重写的过程中,程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的AOF文件中。
    举个例子,如果数据库中包含三个键k1、k2、k3,并且k2已经过期,那么在进行重写工作时,程序只会对k1和k3进行重写,而k2则会被忽略。
    复制(如果服务器以从服务器模式运行)
    当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制:

    主服务器在删除一个过期键之后,会显式地向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键;
    从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键;
    从服务器只有在接到主服务器发来的DEL命令之后,才会删除过期键。

    参考:
    https://blog.csdn.net/qq_36223142/article/details/89399949
    https://www.cnblogs.com/lukexwang/p/4710333.html

    相关文章

      网友评论

          本文标题:redis入门(六)Key过期,内存淘汰机制

          本文链接:https://www.haomeiwen.com/subject/vljgrctx.html