Redis 过期淘汰策略
Redis使用懒惰删除+定期删除相结合的方式处理过期的key
定期删除 -- 大量数据可能无法删除完
当我们为KEY设置了过期时间后,Redis会将所有设置了过期时间的key放入一个字典中,Redis默认每隔100ms(1s10次扫描,每次扫描默认不会超过25ms)
随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
可以通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。
为了保证不出现循环过度的情况,Redis还设置了扫描的时间上限,默认不会超过25ms。
惰性删除 -- 对内存影响
被动删除,只有当你查找KEY时,Redis会对KEY进行会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。
并不是key到时间就被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下
淘汰策略
淘汰策略使用在 定期删除和惰性删除后所遗漏的过期KEY,(总是会遗留一些)堆积在内存中,慢慢超过设置的最大内存时,执行淘汰策略
Redis 具体有 6 种淘汰策略:
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
allkeys-lru:从所有数据集中挑选最近最少使用的数据淘汰
allkeys-random:从所有数据集中任意选择数据进行淘汰
noeviction:禁止驱逐数据(直接报错)