你的redis满了,看看redis的淘汰策略吧

138 阅读2分钟

redis是大家常用到的数据库之一,经常有小伙伴使用redis作为消息队列或者是缓存,大部分小伙伴使用redis的原因也很简单,就是基于内存的存储策略,高效,但是,如果你的redis内存满了咋办,我们来聊聊redis的内存淘汰策略。

Redis内存设置

首先要明白,redis的存储空间不是无限大的,我们可以通过命令来查看redis能使用的最大内存大小:

config get maxmemory

当然也可以通过命令设置redis内存大小,比如设置位10M:

config set maxmemory 10mb

这里要注意的是如果不设置最大内存或者将最大内存参数设置为0,在64为的系统上,是不限制内存大小的,但是在32位的系统上,则默认是3G(因为32位系统本身最大支持4G内存)。

Redis内存淘汰策略

那么问题来了,如果我们设置redis内存为10M,这个时候已经使用完,该如何处理呢?redis提供了策略来进行内存淘汰,既然是策略就不可能只有一种:

1、noeviction: 这个策略是默认策略,提供的内存淘汰方法也很简单,如果内存满了,再存入直接报错,拒绝服务,坐等用户操作。(嘿嘿嘿,这里注意不拒绝delete操作)

2、allkeys_lru: 这里首先要理解lru,这个在之前聊缓存的时候也有说过,就是最近最少使用算法,这个策略会从内存当中检测所有的key, 然后去除最近最少使用的key,来腾出空间。

3、volatile-lru: 这个策略和allkeys_lru逻辑类似,不过检测的范围有所不同是对所有设置有过期时间的key进行检测,也就是说,没有设置过期时间的不会被检测到。

4、allkeys-random: 嘿嘿嘿,这个random很灵性,就是随机,有没有想到一个打响指的大佬(见封面),对策略就是随机删除key,建议谨慎使用。

5、volatile-random:这个就更加明显了,就是从设置了过期时间的key当中随机删除一个。

6、volatile-ttl: 这种策略下,会删除设置过期key当中最接近过期时间的key。

上面就是6种策略,设置的方法也很简单,以设置第6种为例

(1) 通过命令修改

config set maxmemory-policy  volatile-ttl

(2) 修改redis.cnof

maxmemory-policy volatile-ttl

但是还有一个点,第三种(volatile-lru),第五种(volatile-random),第六种(volatile-ttl)策略都是基于有过期时间的来说的,假如所有的key都没有过期时间,那么这三种策略的返回和第一种策略是一样的。

关于redis的内存淘汰策略就聊这么多,欢迎各位大佬多多指点。