2021-08-31 16:31:16 +02:00
|
|
|
package cache
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// DefaultCache is the default cache.
|
|
|
|
DefaultCache Cache = NewCache()
|
|
|
|
// DefaultExpiration is the default duration for items stored in
|
|
|
|
// the cache to expire.
|
|
|
|
DefaultExpiration time.Duration = 0
|
|
|
|
|
|
|
|
// ErrItemExpired is returned in Cache.Get when the item found in the cache
|
|
|
|
// has expired.
|
|
|
|
ErrItemExpired error = errors.New("item has expired")
|
|
|
|
// ErrKeyNotFound is returned in Cache.Get and Cache.Delete when the
|
|
|
|
// provided key could not be found in cache.
|
|
|
|
ErrKeyNotFound error = errors.New("key not found in cache")
|
|
|
|
)
|
|
|
|
|
|
|
|
// Cache is the interface that wraps the cache.
|
|
|
|
type Cache interface {
|
2022-06-21 21:05:00 +02:00
|
|
|
// Get gets a cached value by key.
|
|
|
|
Get(ctx context.Context, key string) (interface{}, time.Time, error)
|
|
|
|
// Put stores a key-value pair into cache.
|
|
|
|
Put(ctx context.Context, key string, val interface{}, d time.Duration) error
|
|
|
|
// Delete removes a key from cache.
|
|
|
|
Delete(ctx context.Context, key string) error
|
|
|
|
// String returns the name of the implementation.
|
|
|
|
String() string
|
2021-08-31 16:31:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Item represents an item stored in the cache.
|
|
|
|
type Item struct {
|
|
|
|
Value interface{}
|
|
|
|
Expiration int64
|
|
|
|
}
|
|
|
|
|
|
|
|
// Expired returns true if the item has expired.
|
|
|
|
func (i *Item) Expired() bool {
|
|
|
|
if i.Expiration == 0 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return time.Now().UnixNano() > i.Expiration
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewCache returns a new cache.
|
|
|
|
func NewCache(opts ...Option) Cache {
|
|
|
|
options := NewOptions(opts...)
|
|
|
|
items := make(map[string]Item)
|
|
|
|
|
|
|
|
if len(options.Items) > 0 {
|
|
|
|
items = options.Items
|
|
|
|
}
|
|
|
|
|
|
|
|
return &memCache{
|
|
|
|
opts: options,
|
|
|
|
items: items,
|
|
|
|
}
|
|
|
|
}
|