要干嘛?

redis存在内存中,内存是有大小的。满了怎么办?
过期策略:redis外面有过期的数据扔掉
淘汰策略:redis淘汰机制

过期策略:

设置过期工夫,不见了怎么办。
ttl key 能够查问它的无效工夫
redis用了被动过期(惰性过期)和定期过期
redis不必被动过期

被动过期(定时过期)

须要定时器始终跑,过期了马上被删除
对内存敌对,不会存在很多过期的key;对cpu不敌对

被动过期(惰性过期)

只有拜访的时候才判断有没有过期
对cpu敌对;对内存不敌对,没有及时删除过期的key

定期过期

定期的去跑,去找有没有过期的,有过期的,删除过期的(相似散布式调度)

  1. 去哪里找?把所有设置过期工夫的放在一起
  2. 找进去当前怎么去过期?
  • 从所有设置过期工夫的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位次数

缓存场景剖析