在项目中,使用缓存是常见的提升性能的一个方法。为防止内存被无限制的消耗,使用内存缓存必须注意到一个淘汰策略,本文就介绍其中的一种算法:LRU。
什么时LRU?
LRU (Least recently used:最近最少使用)算法在缓存写满的时候,会根据所有数据的访问记录,淘汰掉未来被访问几率最低的数据。也就是说该算法认为,最近被访问过的数据,在将来被访问的几率最大。
简单的理解,就是当缓存需要淘汰时,先淘汰最早写入且最近没有被查询过的缓存元素。
示例图
Demo
- 算法实现
利用链表的特性,将Put或Get调用的关键字,都放在队列的头部。每次触发容量上限,就先删除队列尾部的关键字。
1 | package cache |
- 使用
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
28package cache
import (
"github.com/stretchr/testify/assert"
"testing"
)
type mockItem string
func (item mockItem) Size() uint64 {
return uint64(len(item))
}
func TestLRUCache(t *testing.T) {
// 实例化一个容量为10的缓存
cache := NewLRUCache(10)
// 插入一个key为a,值为hello的元素,占用5个长度的容量
cache.Put("a", mockItem("hello"))
// 测试能正常获取
assert.Equal(t, mockItem("hello"), cache.Get("a"))
// 插入一个world,占用6个长度的容量,此刻cache的总容量已被占满
cache.Put("b", mockItem("world"))
// 再插入一个go,空间不够,就会淘汰先插入的hello
cache.Put("c", mockItem("go"))
assert.Equal(t, mockItem("go"), cache.Get("c"))
// 此刻再获取,就返回nil,因为hello已被删除
assert.Nil(t, cache.Get("a"))
}
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2022/07/14/algorithm-cache/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!