Redis 淘汰策略

Redis已经设置了过期时间也就是TTL,那么键过期了不就是已经删除了吗?为什么还存在淘汰策略呢?

这要从Redis的过期策略来聊起

过期策略分为两种

  • 一个是定时删除
  • 还有一个是惰性删除

先来看下定时删除,就是Redis会将每个设置了过期时间的key,放入到一个独立的字典中,然后会定期遍历这个字典来删除到期的key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key。

所谓惰性策略就是在客户端访问这个 key 的时候,Redis 对 key 的过期时间进行检查,如果过期了就立即删除。

说白了,定时删除是集中处理,而惰性删除是零散处理。

因为Redis不可能遍历这个字典中所有的key

举个例子:假如 Redis 中存了几十万个 key,每隔一段时间就会遍历所有的设置过期时间的Key,就会给CPU带来很大的负载。

所以Redis默认会每秒进行十次过期扫描,也就是100MS一次,过期扫描不会遍历过期字典中所有的Key,而是采用了一种简单的贪心策略

什么是贪心策略

  • 就是从过期字典中随机20个key
  • 删除这 20 个 key 中已经过期的 key;
  • 如果过期的 key 比率超过 1/4,那就重复步骤 1;

同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

如何配置定期删除执行的时间间隔呢?

Redis的定时任务默认是1s执行10次,也就是100ms一次,值越大说明刷新频率

你可能感兴趣的:(Redis,redis,缓存,java,.net)