LRU淘汰算法基本思路

如果内容只被占用,势必会导致内存撑爆,导致缓慢,甚至宕机,因此就需要淘汰算法来淘汰低频度使用的数据,释放内存。
在Redis中就是采用LRU淘汰算法来释放内存
LRU淘汰算法的基本思路如下:
在LRU算法中,使用了一种有趣的数据结构,这种数据结构叫作哈希链表。
哈希表是由若干个Key-Value组成的。在“逻辑”上,这些KeyValue是无所谓排列顺序的,谁先谁后都一样。

image.png

在哈希链表中,这些Key-Value不再是彼此无关的存在,而是被一个链条串了起来。每一个Key-Value都具有它的前驱Key-Value、后继Key-Value,就像双向链表中的节点一样。
image.png

这样一来,原本无序的哈希表就拥有了固定的排列顺序。
以用户信息的需求为例,来演示一下LRU算法的基本思路。

  1. 假设使用哈希链表来缓存用户信息,目前缓存了4个用户,这4个用户是按照被访问的时间顺序依次从链表右端插入的。


    image.png
  2. 如果这时业务方访问用户5,由于哈希链表中没有用户5的数据,需要从数据库中读取出来,插入到缓存中。此时,链表最右端是最新被访问的用户5,最左端是最近最少被访问的用户1。


    image.png
  3. 接下来,如果业务方访问用户2,哈希链表中已经存在用户2的数据,这时我们把用户2从它的前驱节点和后继节点之间移除,重新插入链表的最右端。此时,链表的最右端变成了最新被访问的用户2,最左端仍然是最近最少被访问的用户1。


    image.png
  4. 接下来,如果业务方请求修改用户4的信息。同样的道理,我们会把用户4从原来的位置移动到链表的最右侧,并把用户信息的值更新。这时,链表的最右端是最新被访问的用户4,最左端仍然是最近最少被访问的用户1。


    image.png
  5. 后来业务方又要访问用户6,用户6在缓存里没有,需要插入哈希链表中。假设这时缓存容量已经达到上限,必须先删除最近最少被访问的数据,那么位于哈希链表最左端的用户1就会被删除,然后再把用户6插入最右端的位置。


    image.png

你可能感兴趣的:(LRU淘汰算法基本思路)