首先,什么是LRU算法呢?全称是:Least recently used,也就是最近最旧未被使用的算法。其核心思想就是:最近被访问到的数据,在未来也可能被访问到。
所以按照LRU算法来说,数据是有个优先级的,最近访问到的优先级就最高,例如:顺序访问1 2 3 4 5 6的话,那么在此刻1的优先级就是最低的。
LRU算法一般用于资源有限的情况下淘汰某些数据使用,Redis的淘汰策略中就有使用LRU实现。
原理
原理其实也很简单,就是每次访问一个元素时就将元素优先级提到最高。所以实现的是需要使用有序的数据结构的,数组,链表都能实现。
为什么不使用队列和栈呢?这是因为有些元素可能是已经存在数据结构中了,那就有可能再次访问它,此时就需要将它移动到首位,而队列和栈只能取队首和栈顶的数据无法将中间部位的数据移动。
例如:
图1
如果使用数组那每次访问已经在数组中的元素时都需要整体移动,效率不高。
所以一般LRU都是使用链表实现的,而使用链表时为了将元素从链表中间调整到链表头,那就需要将当前这个元素的前后元素改变指针,所以为了能取得前一个元素,则链表也需要使用双向链表。
再然后如果单纯使用链表的