Redis内存淘汰策略

作者: xupengzhang | 来源:发表于2019-03-10 22:18 被阅读0次

    Expire

    Redis的数据可以采用expire命令 设置过期时间,到了过期时间之后reids并不是立即将过期的key删除;
    而是采用了两种方式来进行过期key的处理:

    • 定期删除:redis默认每隔1000ms随机获取部分key,如果已经过期就将对应的key删除;

    • 惰性删除:在每次访问key的时候回检查key是否已经过期,如果过期就将对应的key删除;

    内存淘汰策略

    redis配置文件中有个maxMemory参数,当内存中的数据达到该最大内存的配置,新的数据写入会执行淘汰策略;
    maxMemory如果设置为0,表示不限制,当系统内存不足以容纳新的写入数据的场景下,redis同样会采取内存淘汰策略:

    1. noeviction: 内存不足以写入新数据的情况下**直接报异常**;
    2. allkeys-lru: 在**所有数据集中**将最少是用的数据移除;
    3. allkeys-random:在**所有数据集中** 随机移除一些数据;
    4. volatile-ttl: 在**设置过期的数据集**中选最早过期的数据进行移除;
    5. volatile-random:在**设置过期的数据集**中随机选择部分数据移除;
    6. volatile-lru:在**设置过期的数据集**中移除最少使用的数据;
    

    内存淘汰策略设置默认是 noeviction;
    # maxmemory-policy noeviction

    LRU

    redis采用的LRU是非精准的LRU算法,基于抽样实现;
    由于redis是单线程的,如果采用全量的数据进行LRU计算,会比较消耗CPU资源;
    因此,redis提供了一个重要参数:
    # maxmemory-samples 5
    该参数表示,每次随机选出5个不经常使用的key进行移除;
    配置的 参数值越大,其LRU结果能接近全量LRU的结果;
    但同时会给CPU带来比较大的开销,因此如果仅仅将redis作为LRU缓存服务使用,建议保持默认配置即可。

    备注:了解一下LRU算法和LRU算法实现;

    相关文章

      网友评论

        本文标题:Redis内存淘汰策略

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