简述
redis共有8种淘汰策略
- 拒绝
- volitate-random
- volitate-lru
- volitate-lfu
- volitate-ttl
- allkeys-random
- allkeys-lru
- allkeys-lfu
触发条件:当redis已经满足最大内存,且又有新的添加请求时 除却拒绝以外的淘汰策略矩阵
淘汰范围\淘汰方式 | random | ttl | lru | lfu |
---|---|---|---|---|
volitate | volitate-random | volitate-ttl | volitate-lru | volitate-lfu |
allkeys | allkeys-random | / | allkeys-lru | allkeys-lfu |
LRU——最近最少未使用
标准实现:使用链表将所有数据都进行链接,每次访问时将数据移至尾节点,每次淘汰时移除头节点 缺点:
- 占用空间大。每个指针会占用字节,redis全部数据的指针会很多
- 损耗性能严重。链表的读取时间复杂度为O(n),访问后修改链表太慢
redis实现:
RedisObject {
unsigned lru;
}
1
2
3
2
3
在RedisObject对象中添加lru,存储的是最后访问的时间戳 挑选n(默认n=5)个数据项,每次淘汰时,淘汰时间戳最小的一个
LFU
标准实现:哈希表 + 链表 缺点同LRU redis实现
- 使用lru字段,记录访问次数和最后访问时间。将lru字段分成了两部分,一部分记录使用次数,一部分记录时间
- 访问次数的增加采用概率随机算法,次数越多,增加的可能性越少
- 访问次数在一定时间间隔内会衰减
淘汰同lru