14

Redis 缓存淘汰策略

 3 years ago
source link: https://zhuanlan.zhihu.com/p/343963744
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Redis 缓存淘汰策略

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 后新增)三种。
v2-bb57a78a0d780a0301a77e4280c3c67d_720w.jpgv2-c7016f9638e1d7e7f1a90dba255fb498_720w.jpg
  • 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 算法在所有数据中进行筛选。

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

本文转载自:Redis 缓存淘汰策略-UCloud优刻得中立云计算用户问答社区

欢迎移步社区,交流关于大U和云计算的一切!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK