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):最近最不频繁使用,针对访问次数 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 个样本进行检测
|