|NO.Z.00016|——————————|BigDataEnd|——|Hadoop&Redis.V16|——|Redis.v16|缓存过期|淘汰策略.v02|

一、LRU
### --- LRU

~~~     LRU (Least recently used) 最近最少使用,
~~~     算法根据数据的历史访问记录来进行淘汰数据,
~~~     其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
### --- 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:

~~~     新数据插入到链表头部;
~~~     每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
~~~     当链表满的时候,将链表尾部的数据丢弃。
~~~     在Java中可以使用LinkHashMap(哈希链表)去实现LRU
### --- 让我们以用户信息的需求为例,来演示一下LRU算法的基本思路:

~~~     假设我们使用哈希链表来缓存用户信息目前缓存了
~~~     4个用户这4个用户是按照时间顺序依次从链表右端插入的。
~~~     # 此时,业务方访问用户5,

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

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

~~~     同样道理,我们把用户4从原来的位置移动到链表最右侧,并把用户信息的值更新。
~~~     这时候,链表中最右端是最新访问到的用户4,最左端仍然是最近最少访问的用户1。
~~~     # 业务访问用户6,用户6在缓存里没有,需要插入到哈希链表。

~~~     假设这时候缓存容量已经达到上限,必须先删除最近最少访问的数据,
~~~     那么位于哈希链表最左端的用户1就会被删除掉,然后再把用户6插入到最右端。

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

posted on   yanqi_vip  阅读(20)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示