写在前面
无论是什么系统,在研发的过程中不可避免的会使用到缓存,而缓存一般来说我们不会永久存储,但是缓存的内容是有限的,那么我们如何在有限的内存空间中,尽可能的保留有效的缓存信息呢? 那么我们就可以使用 LRU/LFU算法
,来维持缓存中的信息的时效性。
LRU 详解
原理
LRU (Least Recently Used:最近最少使用)算法在缓存写满的时候,会根据所有数据的访问记录,淘汰掉未来被访问几率最低的数据。也就是说该算法认为,最近被访问过的数据,在将来被访问的几率最大。
流程如下:
假设我们有这么一块内存,一共有26个数据存储块。
- 当我们连续插入A、B、C、…Z的时候,此时内存已经
插满
了 - 那么当我们再插入一个6,那么此时会将内存存放时间最久的数据A淘汰掉。
- 当我们从外部读取数据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的函数,如