This commit is contained in:
HuangJiaLuo 2021-09-05 22:48:01 +08:00
parent f7abb56e92
commit ee8c3d42e8
1 changed files with 91 additions and 26 deletions

View File

@ -1,45 +1,110 @@
package lru
package main
import (
"container/list"
"gitee.com/timedb/wheatCache/pkg/lru/define"
"fmt"
)
type CacheNode struct {
value int
key string
type Node struct {
Key, Value interface{}
}
type Cache struct {
cache map[string]*list.Element
func (*Node) NewCacheNode(k, v interface{}) *Node {
return &Node{k, v}
}
type LRUCache struct {
maxsize int //最大的长度
li *list.List
size int // LRU的长度
MaxByte int64 // 允许的最大存储
NowByte int64 // 目前的存储
LruMap map[interface{}]*list.Element
}
// 创建一个LRU
func NewLRU() *Cache {
return &Cache{
MaxByte: define.MaxByte,
size: 0,
NowByte: 0,
cache: make(map[string]*list.Element),
// lru初始化
func NewLRUCache(size int) *LRUCache {
return &LRUCache{
maxsize: size,
li: list.New(),
LruMap: make(map[interface{}]*list.Element)}
}
//返回lru的长度
func (lru *LRUCache) GetSize() int {
return lru.li.Len()
}
//增
func (lru *LRUCache) Add(k, v interface{}) error {
if lru.li == nil {
return nil
}
if PreEle, ok := lru.LruMap[k]; ok {
lru.li.MoveToFront(PreEle)
PreEle.Value.(*Node).Value = v
return nil
}
newEle := lru.li.PushFront(&Node{k, v})
lru.LruMap[k] = newEle
//超过最长就删
if lru.li.Len() > lru.maxsize {
// 去掉最后一个
last := lru.li.Back()
if last == nil {
return nil
}
Node := last.Value.(*Node)
delete(lru.LruMap, Node.Key)
lru.li.Remove(last)
}
return nil
}
//
func GetLRU() {
//
func (lru *LRUCache) Get(k interface{}) (v interface{}, ret bool) {
if lru.LruMap == nil {
return v, false
}
if PreEle, ok := lru.LruMap[k]; ok {
// 移到最前面
lru.li.MoveToFront(PreEle)
return PreEle.Value.(*Node).Value, true
}
return v, false
}
//
func (c *Cache) AddLRU(key string, value int) {
c.size += 1
//删
func (lru *LRUCache) Remove(k interface{}) bool {
if lru.LruMap == nil {
return false
}
if PreEle, ok := lru.LruMap[k]; ok {
cacheNode := PreEle.Value.(*Node)
delete(lru.LruMap, cacheNode.Key)
lru.li.Remove(PreEle)
return true
}
return false
}
//获取链表长度
func (c *Cache) GetLRULength() int {
return c.size
func main() {
lru := NewLRUCache(3)
lru.Add(10, "test1")
lru.Add(20, "test2")
lru.Add(30, "test3")
v, ret := lru.Get(10)
if ret {
fmt.Println(v)
}
lru.Add(40, "test4")
v, ret = lru.Get(20)
if ret {
fmt.Println(v)
}
}