简述

redis共有8种淘汰策略

  1. 拒绝
  2. volitate-random
  3. volitate-lru
  4. volitate-lfu
  5. volitate-ttl
  6. allkeys-random
  7. allkeys-lru
  8. allkeys-lfu

触发条件:当redis已经满足最大内存,且又有新的添加请求时 除却拒绝以外的淘汰策略矩阵

淘汰范围\淘汰方式 random ttl lru lfu
volitate volitate-random volitate-ttl volitate-lru volitate-lfu
allkeys allkeys-random / allkeys-lru allkeys-lfu

LRU——最近最少未使用

标准实现:使用链表将所有数据都进行链接,每次访问时将数据移至尾节点,每次淘汰时移除头节点 缺点:

  1. 占用空间大。每个指针会占用字节,redis全部数据的指针会很多
  2. 损耗性能严重。链表的读取时间复杂度为O(n),访问后修改链表太慢

redis实现: ​

RedisObject {
    unsigned lru;
}
1
2
3

在RedisObject对象中添加lru,存储的是最后访问的时间戳 挑选n(默认n=5)个数据项,每次淘汰时,淘汰时间戳最小的一个

LFU

标准实现:哈希表 + 链表 缺点同LRU redis实现

  1. 使用lru字段,记录访问次数和最后访问时间。将lru字段分成了两部分,一部分记录使用次数,一部分记录时间
  2. 访问次数的增加采用概率随机算法,次数越多,增加的可能性越少
  3. 访问次数在一定时间间隔内会衰减

淘汰同lru