-
Notifications
You must be signed in to change notification settings - Fork 137
/
impl_inmemory.go
66 lines (51 loc) · 1.01 KB
/
impl_inmemory.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
package limits
import (
"sync"
"time"
)
var counterCleanInterval = 1 * time.Second
type memRef struct {
val int64
exp time.Time
}
// InMemory implementation ofr [Counter].
type InMemory struct {
mu sync.Mutex
vals map[string]*memRef
}
// NewInMemory returns a in-memory counter.
func NewInMemory() *InMemory {
counter := &InMemory{vals: make(map[string]*memRef)}
go counter.cleaner()
return counter
}
func (i *InMemory) cleaner() {
for range time.Tick(counterCleanInterval) {
i.mu.Lock()
now := time.Now()
for k, v := range i.vals {
if now.After(v.exp) {
delete(i.vals, k)
}
}
i.mu.Unlock()
}
}
func (i *InMemory) Increment(key string, timeLimit time.Duration) (int64, error) {
i.mu.Lock()
defer i.mu.Unlock()
if _, ok := i.vals[key]; !ok {
i.vals[key] = &memRef{
val: 0,
exp: time.Now().Add(timeLimit),
}
}
i.vals[key].val++
return i.vals[key].val, nil
}
func (i *InMemory) Reset(key string) error {
i.mu.Lock()
defer i.mu.Unlock()
delete(i.vals, key)
return nil
}