缓存三种常用算法(FIFO、LRU、LFU)

FIFO算法

FIFO思想是先进先出,这是最简单最公平的一种思想。空间满的时候,最先进入的数据先被淘汰。
FIFO算法描述:设计一种缓存结构,构造时确定大小

  1. set(key,value) 将键值对插入该结构,当缓存满,将最先进入缓存的数据置换掉
  2. get(key):返回key的value值

实现策略:维护一个FIFO队列,按照时间顺序将各数据push到队列,将置换指针指向队首,当队列满时,只需将置换指针指向的数据tpop掉,然后将新加入的数据rpush到队列即可
缺点:缺页率随着分配页数的增加而增加(Belady现象)。FIFO与进程访问的异步行不相容,置换的内存往往时被频繁访问的

LRU(最近最久未使用)算法

redis中广泛使用。
LRU思想:若一个数据在最近一段时间没有访问到,那么将来访问的可能性也很小,最近最久未使用的数据最先被淘汰。
LRU算法描述:设计一种缓存结构,构造时确定大小

  1. set(key,value) 将键值对插入该结构,当缓存满,将最久未使用的数据置换掉
  2. get(key):返回key的value值

实现策略:最朴素的思想是用数组+时间戳的方式,但是效率很低。我们使用双向列表+hashmap实现,LinkedHashMap

LFU(最近最少使用)算法

LFU思想:若一个数据在最近一旦时间很少访问到,那么将来访问的可能也很小。当空间满时,最小频率访问的数据最先淘汰。
LRU算法描述:设计一种缓存结构,构造时确定大小

  1. set(key,value) 将键值对插入该结构,当缓存满,将访问频率最低的数据置换掉
  2. get(key):返回key的value值

实现策略:LFU淘汰访问频率最小的数据,需要找到一种方法维护数据访问频率。可看作top10的问题。因此我们很容易想到可以用二项堆来选择频率最小的元素,这样的实现比较高效。最终实现策略为小顶堆+哈希表

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值