缓存置换算法

在缓存设计中,一个非常重要的问题就是,当缓存空间满了的时候,新的条目要加进来,要置换出哪个的旧条目呢, 这就是缓存置换算法
缓存置换算法的目标是,每次都将将来使用频率最低的数据置换出去。
最朴素的置换算法,随机置换。即当有新条目要写入时,随机置换出一个就条目。另外一种策略是先进后出(First In Last Out),这种看似要比随机强,实际都差不多,只是不是随机而是把最久的条目置换掉了。一般会使用栈这种数据结构来实现。
最近未使用(Not Recently Used),这也是一种简单有效的算法。它所依据的理论是,最近未使用的数据,将来使用的概率也会比最近经常使用的数据低。我认为深层次的理论依据应该是,程序的局部性原理。它是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。从算法实现的角度,我们可以这样实现,为每个条目增加一个计数器初始为0,将所有条目放到一个链表中,当有条目操作时,将此条目计数器置为1,那么没有被访问的条目计数器则为零。当新条目来的时候,只需要遍历链表,把计数为0的条目置换出去即可。但是这个算法也有一个问题,那就是条目数据访问也有次数的多少,如果当前所有条目都被访问了,那么新的条目将无法插入。于是就有了下面的算法。
最少使用(Least Frequently Used) ,但是这个算法也有个问题,就是使用次数会一直累计,不会减少,这就导致过去常用的数据,留在内存中而不是最近。所以,有了下面的LRU。
最近最少使用(Least Recently Used) , 相对NRU,它更周密。它将最近一段时间最少使用到的数据淘汰掉,把空间让留给最近频繁使用的数据。
在这里插入图片描述

最经典的数据结构是双向链表,用双向链表来维护缓存条目。如果某个缓存条目被访问到了,就将该条目移动到表头。如果要置换某个条目,则从双向链表尾部删除一个条目。
还有一种有趣的算法是LFUDA(LFU with dynamic aging) , 它再LFU的基础上加上了时间因子,当有访问的时候,计数器增加,当没有访问操作的计数器减少,从而实现动态老化,避免旧数据一直占用内存。置换时,取计数器最小的条目置换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值