过期策略
我们知道redis是一个可以为key设置过期时间的缓存数据库,当这些key过期后把当前过期对象从redis清除的行为就是过期策略;
试想redis里面存储大量设置了过期时间的数据时,如果在相同时间过期,redis会不会因为清理庞大的过期数据而无法响应正常的业务请求呢,因为redis是单线程的,如果在清理过期数据上消耗过多时间势必导致线上读写指令出现卡顿。
Redis的过期策略采用的那种?
定时扫描是怎么个流程?
从过期字典中随机选出20个key;
删除20个key中已经过期的key;
如果这个20个key当中的过期key占比超过四分之一,重复步骤1;
从库的过期策略和主库一样?
Redis的淘汰策略
noevication:拒绝写服务,读服务正常
volatile-lru:在过期key集合中,最近最少使用的key优先被淘汰
volatile-ttl:早过期key集合中,剩余寿命最短的key优先被淘汰
volatile-random:过期key集合中随机淘汰一部分key
allkeys-lru:在全部key集合中,最近最少使用的key优先被淘汰
allkeys-random:全部key集合中随机淘汰一部分key
什么是LRU算法?
Redis采用的是近似LRU算法
真正的LRU算法需要链表数据结构耗费太多的内存,所以redis的LRU算法不是真正的Lru算法但是也能近似达到LRU算法的效果;
redis会在每个对象增加一个额外的记录操作时间的时间戳,用来记录元素的访问顺序,
redis会随机采样一定数量的key,如果是allkeys就是从所有key字典中随机,这里需要看maxmemory-policy配置的淘汰策略
每次采样多少个 key 看的是 maxmemory_samples 的配置,默认为 5。
文章转载自疯狂造轮子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。