美文网首页
Redis变慢了(四) - 实例内存达到上限

Redis变慢了(四) - 实例内存达到上限

作者: aoshi | 来源:发表于2020-11-26 14:13 被阅读0次

    转载地址 :https://www.jianshu.com/p/1ec5af47ae00

    实例内存达到上限

    有时我们把Redis当做纯缓存使用,就会给实例设置一个内存上限maxmemory,然后开启LRU淘汰策略。

    当实例的内存达到了maxmemory后,你会发现之后的每次写入新的数据,有可能变慢了。

    导致变慢的原因是,当Redis内存达到maxmemory后,每次写入新的数据之前,必须先踢出一部分数据,让内存维持在maxmemory之下。

    这个踢出旧数据的逻辑也是需要消耗时间的,而具体耗时的长短,要取决于配置的淘汰策略:

    allkeys-lru:不管key是否设置了过期,淘汰最近最少访问的key
    volatile-lru:只淘汰最近最少访问并设置过期的key
    allkeys-random:不管key是否设置了过期,随机淘汰
    volatile-random:只随机淘汰有设置过期的key
    allkeys-ttl:不管key是否设置了过期,淘汰即将过期的key
    noeviction:不淘汰任何key,满容后再写入直接报错
    allkeys-lfu:不管key是否设置了过期,淘汰访问频率最低的key(4.0+支持)
    volatile-lfu:只淘汰访问频率最低的过期key(4.0+支持)

    具体使用哪种策略,需要根据业务场景来决定。

    我们最常使用的一般是allkeys-lru或volatile-lru策略,它们的处理逻辑是,每次从实例中随机取出一批key(可配置),然后淘汰一个最少访问的key,之后把剩下的key暂存到一个池子中,继续随机取出一批key,并与之前池子中的key比较,再淘汰一个最少访问的key。以此循环,直到内存降到maxmemory之下。

    如果使用的是allkeys-random或volatile-random策略,那么就会快很多,因为是随机淘汰,那么就少了比较key访问频率时间的消耗了,随机拿出一批key后直接淘汰即可,因此这个策略要比上面的LRU策略执行快一些。

    但以上这些逻辑都是在访问Redis时,真正命令执行之前执行的,也就是它会影响我们访问Redis时执行的命令。

    另外,如果此时Redis实例中有存储大key,那么在淘汰大key释放内存时,这个耗时会更加久,延迟更大,这需要我们格外注意。

    如果你的业务访问量非常大,并且必须设置maxmemory限制实例的内存上限,同时面临淘汰key导致延迟增大的的情况,要想缓解这种情况,除了上面说的避免存储大key、使用随机淘汰策略之外,也可以考虑拆分实例的方法来缓解,拆分实例可以把一个实例淘汰key的压力分摊到多个实例上,可以在一定程度降低延迟。

    相关文章

      网友评论

          本文标题:Redis变慢了(四) - 实例内存达到上限

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