45

漫画:什么是LRU算法?

 5 years ago
source link: https://blog.csdn.net/csdnsevenn/article/details/83965773?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击上方“ 程序人生 ”,选择“置顶公众号”

第一时间关注程序猿(媛)身边的故事

bUFJniM.jpg!web

述者

小灰

已获原作者授权,如需转载,请联系原作者。

EVJvQbu.jpg!web

2uaQFr7.jpg!web

jaYfMnN.jpg!web

bUFJniM.jpg!web

—————  两个月前  —————

f2Q73mu.jpg!web

ABjm6vE.jpg!web

ZjaqM3j.jpg!web

yquaqiq.png!web

q2Qv6bj.jpg!web

6VNv2au.jpg!web

用户信息当然是存在数据库里。但是由于我们对用户系统的性能要求比较高,显然不能每一次请求都去查询数据库。

所以,小灰在内存中创建了一个哈希表作为缓存,每次查找一个用户的时候先在哈希表中查询,以此提高访问性能。

aIVNfuY.png!web

很快,用户系统上线了,小灰美美地休息了几天。

一个多月之后......

IJnAfae.jpg!web

Vz6bm2Q.jpg!web

FRZ3e2J.jpg!web

RjmY3eR.jpg!web

RFbUNbv.jpg!web

EzYBBzV.jpg!web

vyInEjA.jpg!web

vEBFRn6.jpg!web

2emEJ32.jpg!web

———————————————

BzeYnqF.jpg!web

r2qYJrY.jpg!web

zmMNZvm.jpg!web

RnmaaiV.jpg!web

qiueEv7.jpg!web

QvYviuy.jpg!web

FRVzayy.jpg!web

QZ32euy.jpg!web

r2yiieF.jpg!web

什么是哈希链表呢?

我们都知道,哈希表是由若干个Key-Value所组成。在“逻辑”上,这些Key-Value是无所谓排列顺序的,谁先谁后都一样。

yqiYbuY.png!web

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

INJRfea.png!web

这样一来,原本无序的哈希表拥有了固定的排列顺序。

vYJZzeN.jpg!web

v6nMZbJ.jpg!web

让我们以用户信息的需求为例,来演示一下LRU算法的基本思路:

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

ymmUn2f.png!web

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

MRZR7n2.png!web

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

v6Jz2uA.png!web

UZ7fMjE.png!web

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

qyuQ3er.png!web

e6bQrmi.png!web

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

yIJFrqy.png!web

MFBBBfj.png!web

以上,就是LRU算法的基本思路。

uQJV3qy.jpg!web

3IfmAnN.jpg!web

需要注意的是,这段不是线程安全的,要想做到线程安全,需要加上synchronized修饰符。

YzAJJf6.jpg!web

YzAJJf6.jpg!web

uMzU73F.jpg!web

aQBz6vz.jpg!web

QNZvMnu.jpg!web

- The End -

「若你有原创文章想与大家分享,欢迎投稿。」

加编辑微信ID,备注#投稿#:

程序 丨 druidlost  

小七 丨 duoshangshuang

点文末 阅读全文 ,看『程序人生』其他精彩文章推荐。

推荐阅读:

neIvUbQ.gif

print_r('点个赞吧');
var_dump('点个赞吧');
NSLog(@"点个赞吧!")
System.out.println("点个赞吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!\n");
cout << "点个赞吧!" << endl;
Console.WriteLine("点个赞吧!");
fmt.Println("点个赞吧!")
Response.Write("点个赞吧");
alert(’点个赞吧’)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK