redis 的 key 过期策略是怎么实现的(经典面试题)

        一个 redis 中可能同时存在很多很多 key,这些 key 中可能有很大一部分有过期时间,此时, redis 服务器咋知道哪些 key 已经过期要被删除,哪些 key 还没过期

        如果直接遍历所有的 key,显然是行不通的,效率通常低

redis 的整体策略是(两者结合)

  • 定期删除
  • 惰性删除

定期删除

每次抽取一部分,进行验证过期时间

保证这个抽取检查的过程,足够快!!!

惰性删除

假设这个 key 已经到过期时间了,但是暂时还没删它,key还存在

紧接着,后面又一次访问,正好用到了这个 key,于是这次访问就会让 redis 服务器触发删除 key 的操作,同时再返回一个 nil(nil 就是 null 的意思)

为什么对于定期删除的时间,有明确的要求呢?(要保证每次抽查的过程足够快)

因为 redis 是单线程的程序,如果扫描过期 key 消耗的时间太多了,就可能导致正常请求命令就被堵塞了(产生了类似于执行 keys * 这样的效果)

虽然有了上述两种策略结合,整体的效果一般,仍然可能会有很多过期的 key 被残留了,没有及时删除掉

redis 为了对上述进行补充,还提供了一系列的内存淘汰策略

你可能感兴趣的:(redis,数据库,缓存)