要干嘛?
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位次数
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。