Redis 删除、淘汰策略

Redis 删除策略

当有 key 设置了过期时间,就会有删除策略

  • 定时删除

以 CPU 定时执行的方式换 Redis 内存(因为会使用轮询的方式一直好用 CPU 资源),及时性不高,但是内存不会浪费

  • 惰性删除

在 get 的时候,先判断 key 是否会过期,如果过期了,会进行删除,会导致有大量的垃圾数据占用内存空间(因为过期的数据在没有进行 get 时,就会一直存在)

  • 定期删除

hz 10
  1. 在 Redis 启动的时候读取配置文件 hz 的值,默认为 10

  2. 每秒执行 hz 次,

  1. 每次执行会一次执行:serverCron() --> databaseCron() --> activeExpireCyle() 三个函数

  1. activeExpireCyle() 对每个 expires[*] (过期库,* 代表对应的数据库,一共 0~15 个,每一个过期库都会和 Redis 的数据库对应)进行逐一检查,每次执行 250ms/hz,默认情况就是 25ms

  2. 对某个 expires[ * ] 检测时,随机挑选 N(默认 20)个 key 检查

  1. 如果 key 超时,删除 key

  2. 如果一轮中删除的 key 的数量 > N * 25%,循环该过程

  3. 如果一轮中删除的 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 个样本进行检测

(0)

相关推荐