-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlru.go
More file actions
85 lines (73 loc) · 1.43 KB
/
Copy pathlru.go
File metadata and controls
85 lines (73 loc) · 1.43 KB
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package lru_cache
import (
"container/list"
"sync"
)
type Lrc struct {
size int
list *list.List
cacheMap map[string]*list.Element
lock sync.RWMutex
}
type data struct {
key string
value interface{}
}
func NewLrc(size int) *Lrc {
return &Lrc{
size: size,
list: list.New(),
cacheMap: make(map[string]*list.Element),
}
}
// Set 写入缓存
func (l *Lrc) Set(key string, value interface{}) {
l.lock.Lock()
defer l.lock.Unlock()
// 判断是否已经存在
if elem, ok := l.cacheMap[key]; ok {
l.list.MoveToFront(elem)
elem.Value.(*data).value = value
return
}
item := &data{
key: key,
value: value,
}
elem := l.list.PushFront(item)
l.cacheMap[key] = elem
// 判断是否超过长度限制
if l.list.Len() > l.size && l.size > 0 {
deleteItem := l.list.Back()
l.list.Remove(deleteItem)
deleteKey := deleteItem.Value.(*data).key
delete(l.cacheMap, deleteKey)
}
}
// Get 读取缓存
func (l *Lrc) Get(key string) (interface{}, bool) {
l.lock.RLock()
value, ok := l.cacheMap[key]
l.lock.RUnlock()
if ok {
l.lock.Lock()
l.list.MoveToFront(value)
l.lock.Unlock()
return value.Value.(*data).value, true
} else {
return nil, false
}
}
// Delete 缓存
func (l *Lrc) Delete(key string) {
l.lock.RLock()
value, ok := l.cacheMap[key]
l.lock.RUnlock()
if ok {
l.lock.Lock()
l.list.Remove(value)
key := value.Value.(*data).key
delete(l.cacheMap, key)
l.lock.Unlock()
}
}