64 lines
1.0 KiB
Go
64 lines
1.0 KiB
Go
package pokecache
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type Cache struct {
|
|
entries map[string]cacheEntry
|
|
mux *sync.RWMutex
|
|
}
|
|
|
|
type cacheEntry struct {
|
|
createdAt time.Time
|
|
val []byte
|
|
}
|
|
|
|
func NewCache(interval time.Duration) Cache {
|
|
cache := Cache{
|
|
entries: make(map[string]cacheEntry),
|
|
mux: &sync.RWMutex{},
|
|
}
|
|
|
|
go cache.reapLoop(interval)
|
|
|
|
return cache
|
|
}
|
|
|
|
func (c *Cache) Add(key string, value []byte) {
|
|
c.mux.Lock()
|
|
defer c.mux.Unlock()
|
|
|
|
c.entries[key] = cacheEntry{
|
|
createdAt: time.Now().UTC(),
|
|
val: value,
|
|
}
|
|
}
|
|
|
|
func (c *Cache) Get(key string) ([]byte, bool) {
|
|
c.mux.RLock()
|
|
defer c.mux.RUnlock()
|
|
|
|
val, ok := c.entries[key]
|
|
return val.val, ok
|
|
}
|
|
|
|
func (c *Cache) reapLoop(interval time.Duration) {
|
|
ticker := time.NewTicker(interval)
|
|
for range ticker.C {
|
|
c.reap(time.Now().UTC(), interval)
|
|
}
|
|
}
|
|
|
|
func (c *Cache) reap(now time.Time, last time.Duration) {
|
|
c.mux.Lock()
|
|
defer c.mux.Unlock()
|
|
|
|
for k, v := range c.entries {
|
|
if v.createdAt.Before(now.Add(-last)) {
|
|
delete(c.entries, k)
|
|
}
|
|
}
|
|
}
|