-
Notifications
You must be signed in to change notification settings - Fork 0
/
lru.go
70 lines (59 loc) · 1.1 KB
/
lru.go
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
package midcache
import (
"fmt"
"midcache/utils"
)
type LRU struct {
List *utils.LinkedList
maxSize int
}
func NewLRU(size int) *LRU {
li := utils.NewList()
lru := &LRU{
List: li,
maxSize: size,
}
return lru
}
func (lru *LRU) Set(key, val string) error {
// 先写再删
err := lru.List.SetHead(key, val)
if err != nil {
return err
}
if lru.List.Size > lru.maxSize {
err := lru.List.DelTail()
if err != nil {
return err
}
}
return nil
}
func (lru *LRU) SetNoRe(key, val string) error {
if lru.List.Size != 0 {
_, node, err := lru.List.GetNode(key)
if err == nil && node != nil {
node.Data[key] = val
return nil
}
}
err := lru.Set(key, val)
if err != nil {
return err
}
return nil
}
func (lru *LRU) Get(key string) string {
pre, node, err := lru.List.GetNode(key)
if err != nil {
fmt.Println("get val error. key:", key, "error: ", err.Error())
return ""
}
err = lru.List.SetFrontNode(pre, node)
//err = lru.List.SetFront(key)
if err != nil {
fmt.Println("set front error. key:", key, "error: ", err.Error())
return ""
}
return node.Data[key]
}