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。