File tree Expand file tree Collapse file tree 1 file changed +13
-7
lines changed Expand file tree Collapse file tree 1 file changed +13
-7
lines changed Original file line number Diff line number Diff line change @@ -20,39 +20,45 @@ type LRU struct {
20
20
cache map [string ]* node
21
21
head * node
22
22
tail * node
23
- mutex sync.Mutex
23
+ cacheMutex sync.RWMutex
24
+ listMutex sync.Mutex
24
25
}
25
26
26
27
func (lru * LRU ) Get (key string ) string {
27
- lru .mutex .Lock ()
28
- defer lru .mutex .Unlock ()
28
+ lru .cacheMutex .RLock ()
29
29
n := lru .cache [key ]
30
30
if n == nil {
31
31
return ""
32
32
}
33
+ lru .cacheMutex .RUnlock ()
33
34
35
+ lru .listMutex .Lock ()
34
36
lru .remove (n )
35
37
lru .insertRight (n )
38
+ lru .listMutex .Unlock ()
36
39
37
40
return n .val
38
41
}
39
42
40
43
func (lru * LRU ) Set (key , value string ) {
41
- lru .mutex .Lock ()
42
- defer lru .mutex .Unlock ()
44
+ lru .cacheMutex .Lock ()
43
45
if n := lru .cache [key ]; n != nil {
44
46
lru .remove (n )
45
47
}
46
-
47
48
n := & node {key : key , val : value }
48
49
lru .cache [key ] = n
50
+ lru .cacheMutex .Unlock ()
51
+ lru .listMutex .Lock ()
49
52
lru .insertRight (n )
50
-
53
+ lru . listMutex . Unlock ()
51
54
// evict
55
+
56
+ lru .listMutex .Lock ()
52
57
if lru .capacity > lru .maxCapacity {
53
58
delete (lru .cache , lru .tail .next .key )
54
59
lru .remove (lru .tail .next )
55
60
}
61
+ lru .listMutex .Unlock ()
56
62
57
63
}
58
64
You can’t perform that action at this time.
0 commit comments