乐趣区

关于redis:Redis个人笔记二

要干嘛?

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 位次数

缓存场景剖析

退出移动版