package main
import (
"container/list"
"errors"
"sync"
)
type Lru struct {
max int
dataList *list.List
dataMap map[interface{}]*list.Element
rwlock sync.RWMutex
}
type node struct {
key interface{}
value interface{}
}
func NewLru(len int) *Lru {
return &Lru{
max: len,
dataList: list.New(),
dataMap: make(map[interface{}]*list.Element),
}
}
func (l *Lru) Add(key interface{}, val interface{}) error {
l.rwlock.Lock()
defer l.rwlock.Unlock()
if l.dataList == nil {
return errors.New("empyt data list")
}
// 已存在,修改value后移至隊首
if e, ok := l.dataMap[key]; ok {
e.Value.(*node).value = val
l.dataList.MoveToFront(e)
return nil
}
// 不存在,在隊首插入新結(jié)點,在map中存儲節(jié)點
ele := l.dataList.PushFront(&node{
key: key,
value: val,
})
l.dataMap[key] = ele
// 如果隊列超過最大距離,移除隊尾的節(jié)點,移除map中的key
if l.max != 0 && l.dataList.Len() > l.max {
if e := l.dataList.Back(); e != nil {
l.dataList.Remove(e)
delete(l.dataMap, e.Value.(*node).key)
}
}
return nil
}
func (l *Lru) Remove(key interface{}) bool {
l.rwlock.Lock()
defer l.rwlock.Unlock()
if l.dataList == nil {
return false
}
// 如果存在節(jié)點,先移至隊首,再返回value
if ele, ok := l.dataMap[key]; ok {
l.dataList.Remove(ele)
delete(l.dataMap, ele.Value.(*node).key)
return true
}
return false
}
func (l *Lru) Get(key interface{}) (val interface{}, ok bool) {
l.rwlock.RLock()
defer l.rwlock.RUnlock()
if l.dataList == nil {
return nil, false
}
// 如果存在節(jié)點,先移至隊首,再返回value
if ele, ok := l.dataMap[key]; ok {
l.dataList.MoveToFront(ele)
return ele.Value.(*node).value, true
}
return nil, false
}
golang版LRU
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 本文代碼已上傳github,歡迎交流。 最近在學(xué)習(xí)go語言,正好有遇到需要使用緩存的地方,于是決定自己造個輪子。主...
- 源碼:https://github.com/bluele/gcache[https://github.com/bl...
- 緩存文件置換機(jī)制是計算機(jī)處理緩存存儲器的一種機(jī)制。 計算機(jī)存儲器空間的大小固定,無法容納服務(wù)器上所有的文件,所以當(dāng)...
- 運用你所掌握的數(shù)據(jù)結(jié)構(gòu),設(shè)計和實現(xiàn)一個 LRU (最近最少使用) 緩存機(jī)制 。實現(xiàn) LRUCache 類: LR...
- LRU緩存淘汰算法 LRU是最近最少使用策略的縮寫。 雙向鏈表實現(xiàn)LRU 將Cache的所有位置都用雙鏈表連接起來...