头图

要干嘛?

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

缓存场景分析


洱海月
1 声望0 粉丝

下一篇 »
初识JAVA