过期策略
过期策略是指Redis设置过期时间且key已经到达过期时间时删除该key,一般有定期删除和惰性删除;
定期删除是指每隔固定时间扫描key,对已经过期的key做清除操作;
定期删除时并不会实际对key做全量扫描,而是随机抽取固定数量的设置了过期时间的key,如果样本中已经过期的key比例超过25%,则清除这些key并重新随机抽取,直到样本中过期的key的比例小于25%
惰性删除是指在key被访问的时候检查该key是否过期,如果过期则清除;
比较:定期删除浪费系统性能,但是保证预留足够的内存;
惰性删除不会浪费系统资源,但是可能造成过期key删除不及时,造成内存浪费;
内存淘汰策略
内存淘汰是指当内存使用量超过了配置的maxmemory时,自动触发对Redis内存的回收,无论key是否过期或者key是否设置了过期时间,跟具体的淘汰策略有关,只是为了释放内存保证Redis的正常运行;maxmemory-plolicy参数配置
常见的内存淘汰策略有:
- noeviction:不淘汰任何数据,内存不足时新增操作返回异常--默认
- allkeys-random:随机淘汰任意键值--淘汰多少
- allkeys-lru:所有键中最久未被使用的key
- volatile-LRU:淘汰设置过期时间的最久未被使用的key
- volatile-ttl:优先淘汰设置过期时间中更早过期的key
- volatile-random:随机淘汰设置了过期时间的key
Redis4中增加了两种:
- volatile-lfu:设置过期时间中最少使用次数的key
- allkeys-lfu:所有键中最少使用次数的key
对比:LRU保护最新写入的key;lfu可能淘汰掉新写入的key;
LFU实现:
相同访问频次下比较访问时间,淘汰访问时间最久(lru即上次访问时间戳最小)的key;
LRU实现:
近似LRU--随机抽取(默认为5)个key,找出lru最小的key并淘汰;