/
cache.go
95 lines (76 loc) · 1.84 KB
/
cache.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package main
import (
"time"
)
type CacheEntry struct {
Data interface{}
ExpirationTime int64
}
func (ce *CacheEntry) IsExpired() bool {
return time.Now().Unix() > ce.ExpirationTime;
}
type CacheManager struct {
CheckingTime int64
DefaultExpirationTime int64
Entries map[uint32]CacheEntry
}
func (cm *CacheManager) GetKeys() []uint32 {
keys := make([]uint32, len(cm.Entries))
i := 0
for k := range cm.Entries {
keys[i] = k
i++
}
return keys
}
func (cm *CacheManager) Exists(entry uint32) bool {
_, ok := cm.Entries[entry]
return ok
}
func (cm *CacheManager) DeleteEntry(entry uint32) {
delete(cm.Entries, entry)
}
func (cm *CacheManager) Invalidate() {
cm.Entries = make(map[uint32]CacheEntry)
}
func (cm *CacheManager) Get(entry uint32) interface{} {
return cm.Entries[entry].Data
}
func (cm *CacheManager) Add(entry uint32, data interface{}) {
cm.Entries[entry] = CacheEntry{
Data: data,
ExpirationTime: cm.DefaultExpirationTime,
}
}
func (cm *CacheManager) ResetTimer(entry uint32) {
centry := cm.Entries[entry]
centry.ExpirationTime = time.Now().Unix() + cm.DefaultExpirationTime
cm.Entries[entry] = centry
}
func (cm *CacheManager) PerformCleanup() {
for k, v := range cm.Entries {
if v.IsExpired() {
delete(cm.Entries, k)
}
}
}
func (cm *CacheManager) AutoCacheCleaner() {
ticker := time.NewTicker(time.Second * time.Duration(cm.CheckingTime))
for range ticker.C {
cm.PerformCleanup()
}
}
func NewCacheManager(defaultExpiration int64, checkingTime int64) (*CacheManager, error) {
return &CacheManager{
DefaultExpirationTime: defaultExpiration,
CheckingTime: checkingTime,
Entries: make(map[uint32]CacheEntry),
}, nil
}
func MustNewCacheManager(defaultExpiration int64, checkingTime int64) *CacheManager {
cm, err := NewCacheManager(defaultExpiration, checkingTime)
if err != nil {
panic(err)
}
return cm
}