概念:
LRU(least recently used)是将近期最不会访问的数据给淘汰掉,其实LRU是认为最近被使用过的数据,那么将来被访问的概率也多,最近没有被访问,那么将来被访问的概率也比较低“,其实这个并不是正确的,但是因为LRU算法简单,存储空间没有被浪费,所以还是用的比较广泛的。
LRU原理:
LRU一般采用链表的放缓死实现,便于快速移动数据位置。网上找了一个图,感觉画的很赞,所以就粘过来了,为了说明问题~~~~~感谢这个图的作者!!!!
LRU的实现有两种方式:缓存命中后,是否要这个数据缓存项到LRU队列的最前端。
首先这个图说明的是LRU的一种实现方式,那就是在缓存访问命中后,要将这个数据缓存项到达LRU队列的最前端。第五步,将E插入缓存池后,这个缓存池已经满了,所以第六步插入F后,要考虑把近期没有访问的数据,也就是A给淘汰掉了(可怜的A啊。。。。)第七步,C被访问,从时间点来说,C最近被访问过了,所以移动到了链表的头部(暂时没有被淘汰);第八步,将G存入缓存后,G位于链表头部,那么B只能被淘汰了。。。。
因为链表的插入和删除时间复杂度都为O(1),所以用链表不用数组。。。。。(这句是参考别人的,还不是很懂,让我研究研究。。。)
还有数据缓存项不移动到LRU最前端的方式,由下面的例题来详细说明。
下面贴一个例题:
例:
大家一起来做题吧!
—————————————————————————————————————————————————————————————————————————————
解:
本题是有两种解答的。
1.缓存命中后,这个数据缓存项不要移动到链表最前端:
命中不调整缓存项内容快照如下:
1. 1
2. 5 1
3. 5 1
4. 3 5 1
5. 3 5 1
6. 2 3 5 1
7. 4 2 3 5(淘汰1)
8. 1 4 2 3 (淘汰5)
9 1 4 2 3(命中2
到达第6步时,缓存池已经满了,所以开始淘汰,淘汰两次,最后淘汰5
2.缓存命中后,这个数据缓存项要移动到链表最前端
1. 1
2. 5 1
3. 1 5
4. 3 1 5
5 .5 3 1
6. 2 5 3 1
7. 4 2 5 3(淘汰1)
8. 1 4 2 5(淘汰3)
9 .2 1 4 5
淘汰2次,最后淘汰3