Redis 删除、淘汰策略
Redis 删除策略
当有 key 设置了过期时间,就会有删除策略
定时删除
以 CPU 定时执行的方式换 Redis 内存(因为会使用轮询的方式一直好用 CPU 资源),及时性不高,但是内存不会浪费
惰性删除
在 get 的时候,先判断 key 是否会过期,如果过期了,会进行删除,会导致有大量的垃圾数据占用内存空间(因为过期的数据在没有进行 get 时,就会一直存在)
定期删除
hz 10
在 Redis 启动的时候读取配置文件 hz 的值,默认为 10
每秒执行 hz 次,
每次执行会一次执行:
serverCron() --> databaseCron() --> activeExpireCyle()
三个函数
activeExpireCyle() 对每个 expires[*] (过期库,* 代表对应的数据库,一共 0~15 个,每一个过期库都会和 Redis 的数据库对应)进行逐一检查,每次执行 250ms/hz,默认情况就是 25ms
对某个 expires[ * ] 检测时,随机挑选 N(默认 20)个 key 检查
如果 key 超时,删除 key
如果一轮中删除的 key 的数量 > N * 25%,循环该过程
如果一轮中删除的 key 的数量 < N * 25%,检查下一个 expires[ * ]
current_db 用于记录 activeExpireCyle() 进入哪一个 expire[ * ] 执行,如果时间到了,那么下次根据 current_db 继续执行
Reids采用的是惰性删除 + 定期删除两种策略结合使用。
Redis 淘汰策略
当 Redis 内存满了,在进行 set 的时候,就会触发淘汰策略
逐出算法
LRU(Least recently used):最近最少使用,针对时间
LFU(Least frequently used):最近最不频繁使用,针对访问次数
maxmemory:最大可使用内存,占用物理内存的比例,默认为 0,表示不限制,生产环境一般根据需求设置,通常在 50 以上
maxmemory-policy:达到最大内存后,对挑选出来的数据进行删除策略(volatile:针对过期数据的策略,allkeys:针对所有数据的策略)
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最长时间没有使用的数据(推荐)
allkeys-lru:从数据集(server.db[i].dict)中挑选最长时间没有使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰(推荐)
volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最近使用次数最少的数据淘汰
allkeys-lfu:从数据集(server.db[i].dict)中挑选最近使用次数最少的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中随机挑选数据淘汰
allkeys-random:从数据集(server.db[i].dict)中随机挑选数据淘汰
noeviction:驱逐,禁止驱逐数据(默认策略)
maxmemory-sample:每次选取待删除的数据个数,选取数据时并不会进行全表扫描,采用随机获取数据的方式作为待检测删除数据,默认选择 5 个样本进行检测