
package cache
import (
"sync"
"time"
)
type Cache struct {
*sync.Map
TTL time.Duration
}
func New(ttl time.Duration) *Cache {
return &Cache{
Map: new(sync.Map),
TTL: ttl,
}
}
func (c *Cache) Store(key, value interface{}) {
c.Map.Store(key, value)
// memory leak?
time.AfterFunc(c.TTL, func() {
c.Map.Delete(key)
})
}
time.Timer
и его методам нет ничего про обязательные деструкторы как у time.Ticker
. При этом в коде выше как минимум 2 проблемы:• Создаётся множество таймеров, что увеличивает потребление ОЗУ и создаёт дополнительную нагрузку на планировщик.
• Если положить значение по ключу дважды, сотрётся оно по истечении первого TTL, а не второго.
И то, и другое можно вылечить, если просто запоминать время установки значения и проходиться по всем значением раз в N миллисекунд, удаляя устаревшие.
@golang_interview