redis过期删除策略

惰性删除

  redis将设置了过期时间的key放到一个独立的字典里面,以后定时遍历这个字典来删除到期的key,同时采用惰性原则,当客户端访问这个key的时候,redis会对其进行检查,如果过期了,那么立即删除。

定时策略

  redis默认每秒10次扫描过期字典的key,不是遍历,而是一种贪心策略。
  1.从过期字典随机20个key。
  2.删除这20个key里面过期的key。
  3.如果过期的key>1/4,那就重复1.
  同时为了避免循环过度,造成线程卡死,算法还设置了一个时间上限,默认不超过25ms。
  
  不要用大量key同一时间过期,会导致系统卡顿。因为卡顿是很多小卡顿积累出来的。

从库的删除策略

  从库不会进行过期扫描,从库的处理是被动的。主库key到期后,会在aof文件里面增加一个del指令,同步到所以的从库。

真删除 del

  redis的单线程是指接受客户端请求的时候是单线程,基于多路io复用,但是redis里面还是有多个异步子线程来进行一些耗时操作的。
  比如:del删除指令会直接释放对象的内存,对于小对象来说,无所谓,秒删,但是对于大的数据,hash,那么就会造成单线程卡顿,redis提供了一个叫unlink的指令,对删除进行懒操作处理。对给后台线程异步回收内存。同时使用这个指令后,主线程就无法访问到了。
  主线程执行这个指令后,就会将这个key的内存回收操作包装为一个任务,塞进异步任务队列,后台线程就会从这个异步队列里面取任务,然后执行。
  Aof sync 操作中一秒一次增量同步,需要频繁磁盘io,耗时,于是也有一个子线程来异步后台处理