1、最近最少使用算法LRU (Least recently used,最近最少使用)
【实现】:最常见的是使用一个链表保存缓存数据
1、新数据插入到链表头部;
2、每当缓存命中(即缓存数据被访问),将数据移动到链表头部;
3、当链表满的时候将链表尾部的数据丢弃;
【代价】
命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。
【改变】
基于以上代价,我们将维护的链表改为一个双向链表(即每个节点都有个prev和next),另外需要再多维护一个map,将缓存对象的引用放入map中;
1、新数据插入链表头部,并且放入map中
2、每当需要使用缓存时,首先通过key到map中查找,命中缓存后将数据移动到链表头部(这个移动就非常好移动了,只需要把该节点的prev节点的next属性赋值为该节点的next节点,同时把该节点的next节点的prev属性赋值为该节点的prev节点,并且将该节点放入链表头部就可以了)。
3、当链表满的时候将链表尾部的数据丢弃,并且删除map中对应的数据。
【结果】
基于以上改变的LRU算法,完全去除了命中缓存需要遍历链表这个缺点,性能得到了大的提升。