1 内存淘汰是指redis使用的内存超过了配置文件里分配给它的内存大小
maxmemory 1GB
2 什么时候触发
其实,在redis执行每一个命令的时候,都会检查当前的内存是否超过最大内存。如果超过,就会触发
1)客户端执行一条新命令,导致数据库需要增加数据(比如set key value)
2)Redis会检查内存使用,如果内存使用超过maxmemory,就会按照置换策略删除一些key
3)新的命令执行成功
3 每次淘汰的内存数据量
如果我们持续的写数据会导致内存达到或超出上限maxmemory,但是置换策略会将内存使用降低到上限以下。
如果一次需要使用很多的内存(比如一次写入一个很大的set),那么,Redis的内存使用可能超出最大内存限制一段时间。
源码中是这样写的
/* Compute how much memory we need to free. */ mem_tofree = mem_used - server.maxmemory; mem_freed = 0; //(2)接下来就判断淘汰策略是基于所有的键还是只是基于设置了过期时间的键,如果是针对所有的键,就从server.db[j].dict中取数据,如果是针对设置了过期时间的键,就从server.db[j].expires中取数据。 while (mem_freed < mem_tofree) {
也就是说,只要降到maxmemory之下,while循环就会停止
4 淘汰算法
volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存
* allkeys-lru:清除最少用的旧缓存,然后保存新的缓存
* volatile-lfu:在那些设置了expire过期时间的缓存中,清除最长时间未用的旧缓存,然后保存新的缓存
* allkeys-lfu:清除最长时间未用的旧缓存,然后保存新的缓存
* volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存
* allkeys-random:在所有的缓存中随机删除(不推荐)
* volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的
* noeviction:旧缓存永不过期,新缓存设置不了,返回错误
方便记忆其实就是分为3种,永不过期特殊情况一种。volatile只针对设置了过期时间一种,allkeys所有的key都算