要干嘛?
redis存在内存中,内存是有大小的。满了怎么办?
过期策略:redis外面有过期的数据扔掉
淘汰策略:redis淘汰机制
过期策略:
设置过期工夫,不见了怎么办。
ttl key 能够查问它的无效工夫
redis用了被动过期(惰性过期)和定期过期
redis不必被动过期
被动过期(定时过期)
须要定时器始终跑,过期了马上被删除
对内存敌对,不会存在很多过期的key;对cpu不敌对
被动过期(惰性过期)
只有拜访的时候才判断有没有过期
对cpu敌对;对内存不敌对,没有及时删除过期的key
定期过期
定期的去跑,去找有没有过期的,有过期的,删除过期的(相似散布式调度)
- 去哪里找?把所有设置过期工夫的放在一起
- 找进去当前怎么去过期?
- 从所有设置过期工夫的key一次性拿20个(hash桶)
- 删除20个外面过期了的
- 如果我这个20外面没有删除任何过期的,或者如果20个key外面删除的超过十分之一,我也会始终循环执行前两步去找过期值(删除一个,阐明没有什么过期的了,下次再来做。serverCron redis的定时事件 每100ms执行一次)
- 每循环16次,我会查看有没有超时,超时了跳进去
淘汰策略
有过期策略为什么还要淘汰?所有key可能都没有设置过期工夫
最大内存大小:maxmemory能够设置最大内存大小
如果没有设置maxmemory的话:64位零碎为电脑内存,32位的是3G
8大淘汰策略:xxx-mmm:xxx代表淘汰的范畴,mmm代表淘汰的形式
redis默认用的是什么:noeviction(不采取任何措施,能取数据,不能写数据)
- volatile-lru
- allkeys-lru
- volatile-lfu
- allkeys-lfu
- volatile-random
- allkeys-random
- volatile-ttl
- noeviction
LRU(最久未应用的)
原始的LRU 依据工夫排序,淘汰最久未应用的
redis原理是一样的
对象有lru字段,每次拜访和创立的时候都会更新lru
零碎工夫-对象lru工夫,值越大,越容易被淘汰
总结:
1.每个数据对象有个lru字段,每次创立和拜访的时候都会更新lru字段,更新后的值为延后100ms的零碎工夫秒单位的最初24位。2.我会把延后100ms的零碎工夫的最初24位跟对象中的lru字段做比拟。3.发现零碎工夫比对象的lru大,那么零碎工夫减lru,相同lrulock+(LRU_CLOCK_MAX-0->lru)4.返回值越大越容易被淘汰
LFU(最不罕用的)
依据次数(降序)工夫(排序)的排序实现开端淘汰
redisObject.lru 字段 24位 16位工夫+8位次数