|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
分类:
bdv012-redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)