Redis已经设置了过期时间也就是TTL,那么键过期了不就是已经删除了吗?为什么还存在淘汰策略呢?
这要从Redis的过期策略来聊起
过期策略分为两种
先来看下定时删除,就是Redis
会将每个设置了过期时间的key,放入到一个独立的字典中,然后会定期遍历这个字典来删除到期的key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key。
所谓惰性策略就是在客户端访问这个 key
的时候,Redis 对 key 的过期时间进行检查,如果过期了就立即删除。
说白了,定时删除是集中处理,而惰性删除是零散处理。
因为Redis不可能遍历这个字典中所有的key
举个例子:假如 Redis 中存了几十万个 key,每隔一段时间就会遍历所有的设置过期时间的Key,就会给CPU带来很大的负载。
所以Redis默认会每秒进行十次过期扫描,也就是100MS一次,过期扫描不会遍历过期字典中所有的Key,而是采用了一种简单的贪心策略
什么是贪心策略
同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。
如何配置定期删除执行的时间间隔呢?
Redis的定时任务默认是1s执行10次,也就是100ms一次,值越大说明刷新频率