LRU是Least Recently Used的缩写,即最近最少使用。是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。
要求:【新增、访问】记录为一次命中,【删除】如果超过数量限制则删除最久未命中的。
lru相比lfu,lru不关注命中次数,lru只关注命中的顺序。
实现
使用map+链表:
1)链表负责维护node的顺序。
2)map负责以O(1)的复杂度快速定位node在链表中的位置。具体的,map的key存node值,map的value存node的地址。
当'node新增'或'访问node命中'时,放或移到链表头;当需要淘汰node时,淘汰链表尾的node。
此时,新增、访问、移动、删除的时间复杂度均为O(1)。
应用
适合:存在热点数据,数据无更新,个体多。
因为量大,所以内存或redis里的缓存不可能全部存,需要淘汰部分不是热点的数据,只留下指定容量的热点数据缓存。
代码(未完)
type LRUNode struct {
Val string
Next *LRUNode
}
type LRU struct {
kv map[string]string
List *LRUNode
Lap int64
}
var LRUSt = &LRU{
kv: make(map[string]string),
List: nil,
}
func (*LRU) LRUGet(k string) (v string) {
}
func (*LRU) LRUSet(k, v string) {
LRUSt.kv[k] = v
if LRUSt.List == nil {
LRUSt.List = &LRUNode{
Val: v,
Next: nil,
}
} else {
LRUSt.List.Next = &LRUNode{
Val: v,
Next: nil,
}
}
}