众所周知,缓存内元素的简单的清除策略 一般包含FIFO,LRU,LFU。FIFO,LFU的实现起来比较的简单,这里不做叙述,但是有一点需要说明的如果缓存内的数据元素非常的多利用LFU遍历一遍或许还需要一些时间。

LRU的应用比较广泛,这里我也顺便整理一下思路。


LRU顾名思义为最近最少访问,即最近最少访问的元素将会在缓存空间中删除。那么问题的关键是---“最近”这个词怎么理解?

根据不同的业务场景理解,“最近”可以为一个具体的时间段,即给缓存内各个元素设定一个时间戳,超过时间范围的元素将会被清除。但是这也会涉及遍历缓存内全部元素的问题,其次时间段的确定也将会是一个问题。但是对于特定的应用场景还是可以的。

另外,"最近"还可以理解为一个抽象的概念,比如操作系统中学到的“局部性原理”。比如一个简单的常见的实现为:


(只说LRU思想,细节暂不考虑):

1,假设缓存空间为一个链表实现,链表的一端进行插入(这里假定为头),另一端进行删除(尾);

2,新加入元素元素插入头;

3,缓存空间内没访问一次元素,那么该元素插入到头;

4,当缓存空间内的元素满的时候,清除尾部的元素。


上述实现思路的评价:

1,上述方法实现简单,实践证明在实践应用中也具有较好的可以性和较高的缓存命中率;

2,但是,这种将最后访问时间距现在最远的元素作为清除者的时候,必定会造成一些不科学的清除。这尤其体现在缓存空间内元素“大”但是元素的个数少的场景下;以及 其他的的一些特殊应用场景中;

3,针对问题2中的只将最后访问时间距现在最远的元素作为清除者的弊端,该算法发展了很多的改进版本。比如适当增加的元素访问计数的思想,如LRU2,等等。。。。

如此链接中就是关于oracle buffer cache的,写的很不错http://blog.chinaunix.net/uid-26762723-id-3259013.html