图解缓存淘汰算法 LRU、LFU | 最近最少使用、最不经常使用算法 | go语言实现

写在前面

无论是什么系统,在研发的过程中不可避免的会使用到缓存,而缓存一般来说我们不会永久存储,但是缓存的内容是有限的,那么我们如何在有限的内存空间中,尽可能的保留有效的缓存信息呢? 那么我们就可以使用 LRU/LFU算法 ,来维持缓存中的信息的时效性。

LRU 详解

原理

LRU (Least Recently Used:最近最少使用)算法在缓存写满的时候,会根据所有数据的访问记录,淘汰掉未来被访问几率最低的数据。也就是说该算法认为,最近被访问过的数据,在将来被访问的几率最大。

流程如下:
在这里插入图片描述
假设我们有这么一块内存,一共有26个数据存储块。

  1. 当我们连续插入A、B、C、…Z的时候,此时内存已经插满
  2. 那么当我们再插入一个6,那么此时会将内存存放时间最久的数据A淘汰掉。
  3. 当我们从外部读取数据C的时候,此时C就会提到头部,这时候C就是最晚淘汰的了。

其实流程来说很简单。我们来拆分一下的话,不难发现这就是在维护一个双向链表

代码实现

定义一个存放的数据块结构

type item struct {
	key   string
	value any

	// the frequency of key
	freq int
}

定义LRU算法的结构体

type LRU struct {
	dl       *list.List // 维护的双端队列
	size     int // 当前的容量
	capacity int // 限定的容量

	storage map[string]*list.Element // 存储的key
}

获取某个key的value的函数,如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值