1、设置redis使用的最大缓存,只有设置了redis的最大缓存,当redis缓存达到设置值时才会执行设置的缓存清除策略。

可以在redis.conf文件中设置,也可以在redis运行过程中,使用 CONFIG SET命令设置。

maxmemory 100mb

 2、redis的缓存清除策略

noeviction: 当达到最大缓存后,客户端再执行使缓存增大的操作时直接返回错误。

allkeys-lru: 从所有的key中,清除最近最少使用的key。

volatile-lru: 从设置了过期时间的key中,清除最近最少使用的key。

allkeys-random: 从所有的key中,随机选一个key清除。

volatile-random: 从设置了过期时间的key中,随机选一个key清除。

volatile-ttl: 从设置了过期时间的key中,清除过期时间最近的一个key。

可以在redis.conf文件中设置清除策略

maxmemory-policy allkeys-lru

一般选择allkeys-lru策略能满足大部分的场景。

3、清除key的过程是怎样的?

  • 客户端执行一个将会增加redis内存占用的操作
  • redis检查redis的内存占用是否已经达到最大值,如果是,则根据设置的策略清除key.
  • 重复第一步

所以,如果客户端向redis一次性插入非常多的数据,那么redis占用的内存,可能会远远超过设置的最大内存值。

4、redis的LRU算法

redis的LRU算法不是标准的算法,而是近似算法,因为标准算法会占用太多内存。

redis会根据策略,从所有的key中或设置了过期时间的key中随机抽取N个样本key,然后从这N个样本key中,选出一个key清除。

这个样本key的数量是可以设置的,这个值越大会越耗cpu, 如下所示

maxmemory-samples 5

redis3.0版本对LRU算法进行了优化,所以redis3.0版本之后,近似的LRU算法和标准算法的效果已经基本相似。

5、LFU算法,最少使用频率算法

redis4.0版本推出了新的LFU算法,Least Frequently Used eviction mode,在某些情况下这种LFU比LRU效果更好。这种算法会跟踪每个key的使用频率,从而使使用频率低的key被清除,而保留使用频率高的key被保留。

对于LRU算法,有一个问题是,对于一个key可能最近一段时间内没有被访问到,但是它的整体访问频率可能会很高,即使是这样,这个key也会被清除,显然这不符合我们的使用场景。而LFU算法就不存在这个问题。

LFU算法会为每个key绑定一个概率计数器,这个计数器和一个衰减时间绑定,如果这个key被取样时发现距离上次被命中的时间已经超过了这个衰减时间,则这个key的概率计数器就会衰减。概率计数器的值的范围是0-255。

LFU清除key时也是采用和LRU一样的取样方式,然后去比较概率计数器的大小,把计数器值最小的key给清除掉。不同的是LFU算法可以配置参数,对衰减时间和概率计数器达到最大值所需的命中次数进行设置。

lfu-log-factor 10
lfu-decay-time 1

lfu-decay-time 1 表示衰减时间为1分钟

 lfu-log-factor 10,配置影响概率计数器达到最大值,对应的key所需命中的次数,所以如果缓存的访问频率高这个参数就要设置的大一些,否则就设置的小一些。如下表所示。

+--------+------------+------------+------------+------------+------------+
| factor | 100 hits   | 1000 hits  | 100K hits  | 1M hits    | 10M hits   |
+--------+------------+------------+------------+------------+------------+
| 0      | 104        | 255        | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 1      | 18         | 49         | 255        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 10     | 10         | 18         | 142        | 255        | 255        |
+--------+------------+------------+------------+------------+------------+
| 100    | 8          | 11         | 49         | 143        | 255

 LFU的策略有两种

  • volatile-lfu 从设置了过期时间的key中清除清除使用频率最低的key。
  • allkeys-lfu 从所有的key中清除使用频率最低的key。