资讯专栏INFORMATION COLUMN

Redis 缓存淘汰策略

Tecode / 1900人阅读

摘要:但是内存空间毕竟有限,随着我们存储数据的不断增长,要缓存的数据量越来越大,当超过了我们的内存大小时,该怎么办呢解决方法有两种增加物理内存搭建集群和缓存数据的淘汰机制。增加物理内存简单粗暴,价格十分昂贵,内存的价格大约是万元左右。

redis 使用的时内存空间来存储数据的,避免业务应用从后端数据库中读取数据,可以提升应用的响应速度。但是内存空间毕竟有限,随着我们存储数据的不断增长,要缓存的数据量越来越大,当超过了我们的内存大小时,该怎么办呢?

解决方法有两种:增加物理内存、搭建 Redis 集群和缓存数据的淘汰机制。增加物理内存简单粗暴,价格十分昂贵,1TB 内存的价格大约是 4 万元左右。所以我们选择缓存数据的淘汰机制。使用简单来说,数据淘汰机制包括两步:第一,根据一定的策略,筛选出对应用访问来说"不重要"的数据;第二,将这些数据从缓存中删除,为新来的数据腾出空间。

在 Redis 的配置文件redis.conf文件中,配置maxmemory的大小参数如下所示:

maxmemory 4gb
# 使用以下命令配置 maxmemory
CONFIG SET maxmemory 4gb

倘若实际的存储中超出了 Redis 的配置参数的大小时,Redis 中有淘汰策略,把需要淘汰的 key 给淘汰掉,整理出干净的一块内存给新的 key 值使用

Redis 4.0 之前一共实现了 6 种内存淘汰策略,在 4.0 之后,又增加了 2 种策略。我们可以按照是否会进行数据淘汰把它们分成两类:

  • 不进行数据淘汰的策略,只有 noeviction 这一种。
  • 会进行淘汰的 7 种其他策略。会进行淘汰的 7 种策略,我们可以再进一步根据淘汰候选数据集的范围把它们分成两类:

    • 在设置了过期时间的数据中进行淘汰,包括 volatile-random、volatile-ttl、volatile-lru、volatile-lfu(Redis 4.0 后新增)四种。
    • 在所有数据范围内进行淘汰,包括 allkeys-lru、allkeys-random、allkeys-lfu(Redis 4.0 后新增)三种。

image

规则规则说明
noeviction当内存不足以容纳新写入的数据时 新写入操作会报错
allkeys-lru当内存不足以容纳新写入数据时 在键空间中 移除最近最少使用的 key
allkeys-random当内存不足以容纳新写入数据时 在键空间中 随机移除某个 key
volatile-lru当内存不足以容纳新写入数据时 在设置了过期时间的键空间中 移除最近最少使用的 key
nvolatile-lru当内存不足以容纳新写入数据时 在设置了过期时间的键空间中 移除最近最少使用的 key
volatile-ttl当内存不足以容纳新写入数据时 在设置了过期时间的键空间中 有更早过期时间的 key 优先移除
  • volatile-ttl:表示在设置可过期时间的键值对中,根据过期时间的先后进行淘汰数据,越早被过期的数据,越先被淘汰。
  • volatile-random:从名字可以看出来,就是在设置了过期时间的键值对中,随机淘汰数据。
  • volatile-lru:会根据 lru 算法进行数据的淘汰
  • allkeys-random:在全部的键值对数据中,进行数据的随机淘汰。
  • allkeys-lru:在全部的键值对数据中,根据 lru 算法进行数据的淘汰。
  • allkeys-lfu:在全部的键值对数据中,根据 lfu 算法进行数据的淘汰。

默认情况下,Redis 在使用的内存空间超过 maxmemory 值时,并不会淘汰数据,也就是设定的 noeviction 策略。对应到 Redis 缓存,也就是指,一旦缓存被写满了,再有写请求来时,Redis 不再提供服务,而是直接返回错误。Redis 用作缓存时,实际的数据集通常都是大于缓存容量的,总会有新的数据要写入缓存,这个策略本身不淘汰数据,也就不会腾出新的缓存空间,我们不把它用在 Redis 缓存中。

例如,我们使用 EXPIRE 命令对一批键值对设置了过期时间后,无论是这些键值对的过期时间是快到了,还是 Redis 的内存使用量达到了 maxmemory 阈值,Redis 都会进一步按照 volatile-ttl、volatile-random、volatile-lru、volatile-lfu 这四种策略的具体筛选规则进行淘汰。

  • volatile-ttl 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
  • volatile-random 就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
  • volatile-lru 会使用 LRU 算法筛选设置了过期时间的键值对。
  • volatile-lfu 会使用 LFU 算法选择设置了过期时间的键值对。

可以看到,volatile-ttl 和 volatile-random 筛选规则比较简单,而 volatile-lru 因为涉及了 LRU 算法,所以我会在分析 allkeys-lru 策略时再详细解释。volatile-lfu 使用了 LFU 算法,我会在第 26 讲中具体解释,现在你只需要知道,它是在 LRU 算法的基础上,同时考虑了数据的访问时效性和数据的访问次数,可以看作是对淘汰策略的优化。

相对于 volatile-ttl、volatile-random、volatile-lru、volatile-lfu 这四种策略淘汰的是设置了过期时间的数据,allkeys-lru、allkeys-random、allkeys-lfu 这三种淘汰策略的备选淘汰数据范围,就扩大到了所有键值对,无论这些键值对是否设置了过期时间。它们筛选数据进行淘汰的规则是:

  • allkeys-random 策略,从所有键值对中随机选择并删除数据;
  • allkeys-lru 策略,使用 LRU 算法在所有数据中进行筛选。
  • allkeys-lfu 策略,使用 LFU 算法在所有数据中进行筛选。

这也就是说,如果一个键值对被删除策略选中了,即使它的过期时间还没到,也需要被删除。当然,如果它的过期时间到了但未被策略选中,同样也会被删除。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/126009.html

相关文章

  • 缓存那些事

    摘要:分布式缓存应用和缓存分离,缓存单独作为一个系统单独部署,多个应用可以共享的访问缓存。通过静态变量一次获取所有的数据缓存起来避免频繁的读取。类似的分布式缓存实现方案还有的集群方案,其实现思想和的实现思想大相径庭。 0x01 前言 提到缓存,那么缓存是什么,为什么需要缓存? 如果知道一点点计算机方面的知识就会知道,计算机的构造也是由多级缓存->硬盘一起来构造计算机的数据存储。当然这里不是来...

    BigTomato 评论0 收藏0
  • 缓存那些事

    摘要:分布式缓存应用和缓存分离,缓存单独作为一个系统单独部署,多个应用可以共享的访问缓存。通过静态变量一次获取所有的数据缓存起来避免频繁的读取。类似的分布式缓存实现方案还有的集群方案,其实现思想和的实现思想大相径庭。 0x01 前言 提到缓存,那么缓存是什么,为什么需要缓存? 如果知道一点点计算机方面的知识就会知道,计算机的构造也是由多级缓存->硬盘一起来构造计算机的数据存储。当然这里不是来...

    Sike 评论0 收藏0
  • 关于redis的几件小事(四)redis的过期策略以及内存淘汰机制

    摘要:的过期策略是什么样的采用了定期删除惰性删除的过期策略。定期删除原理定期删除指的是默认每隔就随机抽取一些设置了过期时间的,检测这些是否过期,如果过期了就将其删掉。所有只会抽取一部分而不会全部检查。 1.数据为什么会过期? 首先,要明白redis是用来做数据缓存的,不是用来做数据存储的(当然也可以当数据库用),所以数据时候过期的,过期的数据就不见了,过期主要有两种情况, ①在设置缓存数据时制定了...

    AbnerMing 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<