删除|一文读懂Redis内存淘汰策略( 二 )

  • noeviction:只返回错误 , 不会删除任何key 。 该策略是Redis的默认淘汰策略 , 一般不会选用 。
  • volatile-ttl:将设置了过期时间的key中即将过期(剩余存活时间最短)的key删除掉 。
  • volatile-random:在设置了过期时间的key中 , 随机删除某个key 。
  • allkeys-random:从所有key中随机删除某个key 。
  • volatile-lru:基于LRU算法 , 从设置了过期时间的key中 , 删除掉最近最少使用的key 。
  • allkeys-lru:基于LRU算法 , 从所有key中 , 删除掉最近最少使用的key 。 该策略是最常使用的策略 。
  • volatile-lfu:基于LFU算法 , 从设置了过期时间的key中 , 删除掉最不经常使用(使用次数最少)的key 。
  • allkeys-lfu:基于LFU算法 , 从所有key中 , 删除掉最不经常使用(使用次数最少)的key 。
  • 需要注意的是 , Redis中的LRU算法并没有严格按照常规的LRU算法的方式实现 , 而是基于LRU算法的思想做了自己的优化 。 在之前文章LRU算法详解?中我们知道 , 实现LRU算法时 , 需要将所有的数据按照访问时间距离当前时间的长短排序放到一个双向链表中 , 基于这个链表实现数据的淘汰 。 但Redis中存储的数据量是非常庞大的 , 如果要基于常规的LRU算法 , 就需要把所有的key全部放到这个双向链表中 , 这样就会导致这个链表非常非常大 , 不止需要提供更多的内存来存放这个链表结构 , 而且操作这么庞大的链表的性能也是比较差的 。
    所以 , Redis中的LRU算法是这样实现的:首先定义一个淘汰池 , 这个淘汰池是一个数组(大小为16) , 然后触发淘汰时会根据配置的淘汰策略 , 先从符合条件的key中随机采样选出5(可在配置文件中配置)个key , 然后将这5个key按照空闲时间排序后放到淘汰池中 , 每次采样之后更新这个淘汰池 , 让这个淘汰池里保留的总是那些随机采样出的key中空闲时间最长的那部分key 。 需要删除key时 , 只需将淘汰池中空闲时间最长的key删掉即可 。
    为了方便理解它的思想 , 我画了一个图:

    Redis内存淘汰策略的配置学习了这8种内存淘汰策略之后 , Redis要什么时候会触发执行这些淘汰策略呢?又要怎么指定使用哪一种淘汰策略呢?这就要去Redis的配置文件中进行配置了
    • 配置redis最大内存
    在配置文件redis.conf 中 , 可以通过参数 maxmemory <bytes> 来设定最大内存:

    当数据内存达到 maxmemory 时 , 便会触发redis的内存淘汰策略 。 该参数通常设定为其物理内存的四分之三 。
    • 配置redis淘汰策略
    在配置文件redis.conf 中 , 通过设置 maxmemory-policy 来指定使用哪种内存淘汰策略:

    • 配置最大采样数量
    上文在讲Redis的LRU算法的时候 , 提到了Redis每次会随机选择5个key放入淘汰池中 , 这个5的数量就是在redis.conf配置文件中通过 maxmemory-samples 选项配置的:

    到这里相信我们已经熟练掌握了Redis的内存淘汰策略以及如何配置使用Redis的内存淘汰策略 , 后续文章会继续针对Redis这一中间件的知识做一系列的学习 。 如果想要了解更多Redis的知识 , 可以查看我的历史文章 。
    点关注不迷路 , 跟我一起学技术!