• 一文了解:Redis过期键删除策略


    Redis过期键删除策略

    Redis中所有的键都可以设置过期策略,就像是所有的键都可以上"生死簿",上了生死簿的键到时间后阎王就会叉掉这个键。同一时间大量的键过期,阎王就会忙不过来。同时因为Redis是单线程的,导致阎王的处理时间会变得很长,而且处理繁忙,Redis就会出现卡顿现象。

    Redis有三种策略删除过期Key

    相关命令

    expire key seconds  # 过期时间为秒数,key不存在时返回(integer) 0,key存在的时返回(integer) 1
    
    pexpire key milliseconds # 同expire,设置的过期时间为毫秒数
    
    setex key seconds value # 只能设置字符串的过期时间
    
    ttl key # 查看Key的过期时间(秒数),用不过期返回(integer) -1,Key不存在返回(integer) -2
    
    pttl key # 同ttl,返回毫秒数
    

    过期Key

    Redis的每个设置了过期时间的Key都会放在一个独立的字典中,用于遍历删除。

    过期策略

    被动删除

    Key在被操作时,Redis主动检查Key是否过期,过期则删除,返回nil

    1. 对CPU友好,只有Key在被操作时删除,不会浪费CPU时间
    2. 对内存不友好,如果同时有大量的Key过期,这些Key在被使用之前不会被删除,就会浪费内存

    主动删除

    Redis会周期性的随机扫描一批设置了过期时间的Key并进行处理,Redis每秒进行10次过期扫描会做的操作有:

    1. 随机扫描100个设置了过期时间的Key
    2. 删除所有发现的过期Key
    3. 如果删除的Key超过1/4则重复步骤1
    hz 10
    

    Redis除了设置每秒10次的扫描频率之外,还设置了每次扫描不会超过25ms的上限,以防出现过度循环扫描,导致线程卡死。

    maxmemory

    # maxmemory <bytes>
    

    当已用的内存超过maxmemory 配置的内存时,会触发主动清除策略

    # maxmemory-policy noeviction
    
    1. noeviction 永不过期策略,当已用内存超过maxmemory配置时,写操作将返回错误,读操作和del操作可以继续服务。
    2. volatile-lru 只删除设置了过期时间的Key,使用频率越少的Key优先删除,不会对没有设置过期时间的Key删除
    3. volatile-ttl 和上面一样,只删除设置过期时间的Key,TTL过期时间越少优先删除
    4. volatile-random 随机删除快要过期的Key
    5. allkeys-lru 和lru一样,删除所有的Key,没有设置过期时间的Key也会被删除
    6. allkeys-random 和上面一样,删除掉随机的Key

    Redis采用的过期策略

    被动删除+主动删除

    结语

    本人深知水平有限,欢迎指正本文错误之处。


    logo

  • 相关阅读:
    多线程调用本质
    音频编码解码器库 libZPlay
    C#多线程代码调试技巧
    SharpMap实践代码
    Work Queue based multithreading
    (转)C#写的NoSQL开源系统(系列)
    A .NET State Machine Toolkit Part I
    在线开发环境地址
    数字音乐商KKBOX三季度将进军日本市场
    苹果官方购置iPad用户将获1100元退款
  • 原文地址:https://www.cnblogs.com/imeng/p/11353207.html
Copyright © 2020-2023  润新知