Documentation
¶
Index ¶
- Constants
- Variables
- func Get[T any](cache *Cache, key string) (T, bool, error)
- func GetContext[T any](ctx context.Context, cache *Cache, key string) (T, bool, error)
- func GetJSON[T any](cache *Cache, key string) (T, bool, error)
- func GetJSONContext[T any](ctx context.Context, cache *Cache, key string) (T, bool, error)
- func NewFileStore(ctx context.Context, dir string) cachecore.Store
- func NewFileStoreWithConfig(ctx context.Context, cfg StoreConfig) cachecore.Store
- func NewMemoStore(store cachecore.Store) cachecore.Store
- func NewMemoryStore(ctx context.Context) cachecore.Store
- func NewMemoryStoreWithConfig(ctx context.Context, cfg StoreConfig) cachecore.Store
- func NewNullStore(ctx context.Context) cachecore.Store
- func NewNullStoreWithConfig(ctx context.Context, cfg StoreConfig) cachecore.Store
- func Pull[T any](cache *Cache, key string) (T, bool, error)
- func PullContext[T any](ctx context.Context, cache *Cache, key string) (T, bool, error)
- func RefreshAhead[T any](cache *Cache, key string, ttl, refreshAhead time.Duration, ...) (T, error)
- func RefreshAheadContext[T any](ctx context.Context, cache *Cache, key string, ttl, refreshAhead time.Duration, ...) (T, error)
- func RefreshAheadValueWithCodec[T any](ctx context.Context, cache *Cache, key string, ttl, refreshAhead time.Duration, ...) (T, error)
- func Remember[T any](cache *Cache, key string, ttl time.Duration, fn func() (T, error)) (T, error)
- func RememberContext[T any](ctx context.Context, cache *Cache, key string, ttl time.Duration, ...) (T, error)
- func RememberStale[T any](cache *Cache, key string, ttl, staleTTL time.Duration, fn func() (T, error)) (T, bool, error)
- func RememberStaleContext[T any](ctx context.Context, cache *Cache, key string, ttl, staleTTL time.Duration, ...) (T, bool, error)
- func Set[T any](cache *Cache, key string, value T, ttl time.Duration) error
- func SetContext[T any](ctx context.Context, cache *Cache, key string, value T, ttl time.Duration) error
- func SetJSON[T any](cache *Cache, key string, value T, ttl time.Duration) error
- func SetJSONContext[T any](ctx context.Context, cache *Cache, key string, value T, ttl time.Duration) error
- type Cache
- func (c *Cache) Add(key string, value []byte, ttl time.Duration) (bool, error)
- func (c *Cache) AddContext(ctx context.Context, key string, value []byte, ttl time.Duration) (bool, error)
- func (c *Cache) BatchGetBytes(keys ...string) (map[string][]byte, error)
- func (c *Cache) BatchGetBytesContext(ctx context.Context, keys ...string) (map[string][]byte, error)
- func (c *Cache) BatchSetBytes(values map[string][]byte, ttl time.Duration) error
- func (c *Cache) BatchSetBytesContext(ctx context.Context, values map[string][]byte, ttl time.Duration) error
- func (c *Cache) Decrement(key string, delta int64, ttl time.Duration) (int64, error)
- func (c *Cache) DecrementContext(ctx context.Context, key string, delta int64, ttl time.Duration) (int64, error)
- func (c *Cache) Delete(key string) error
- func (c *Cache) DeleteContext(ctx context.Context, key string) error
- func (c *Cache) DeleteMany(keys ...string) error
- func (c *Cache) DeleteManyContext(ctx context.Context, keys ...string) error
- func (c *Cache) Driver() cachecore.Driver
- func (c *Cache) Flush() error
- func (c *Cache) FlushContext(ctx context.Context) error
- func (c *Cache) GetBytes(key string) ([]byte, bool, error)
- func (c *Cache) GetBytesContext(ctx context.Context, key string) ([]byte, bool, error)
- func (c *Cache) GetString(key string) (string, bool, error)
- func (c *Cache) GetStringContext(ctx context.Context, key string) (string, bool, error)
- func (c *Cache) Increment(key string, delta int64, ttl time.Duration) (int64, error)
- func (c *Cache) IncrementContext(ctx context.Context, key string, delta int64, ttl time.Duration) (int64, error)
- func (c *Cache) Lock(key string, ttl, timeout time.Duration) (bool, error)
- func (c *Cache) LockContext(ctx context.Context, key string, ttl, retryInterval time.Duration) (bool, error)
- func (c *Cache) NewLockHandle(key string, ttl time.Duration) *LockHandle
- func (c *Cache) PullBytes(key string) ([]byte, bool, error)
- func (c *Cache) PullBytesContext(ctx context.Context, key string) ([]byte, bool, error)
- func (c *Cache) RateLimit(key string, limit int64, window time.Duration) (RateLimitStatus, error)
- func (c *Cache) RateLimitContext(ctx context.Context, key string, limit int64, window time.Duration) (RateLimitStatus, error)
- func (c *Cache) Ready() error
- func (c *Cache) ReadyContext(ctx context.Context) error
- func (c *Cache) RefreshAheadBytes(key string, ttl, refreshAhead time.Duration, fn func() ([]byte, error)) ([]byte, error)
- func (c *Cache) RefreshAheadBytesContext(ctx context.Context, key string, ttl, refreshAhead time.Duration, ...) ([]byte, error)
- func (c *Cache) RememberBytes(key string, ttl time.Duration, fn func() ([]byte, error)) ([]byte, error)
- func (c *Cache) RememberBytesContext(ctx context.Context, key string, ttl time.Duration, ...) ([]byte, error)
- func (c *Cache) RememberStaleBytes(key string, ttl, staleTTL time.Duration, fn func() ([]byte, error)) ([]byte, bool, error)
- func (c *Cache) RememberStaleBytesContext(ctx context.Context, key string, ttl, staleTTL time.Duration, ...) ([]byte, bool, error)
- func (c *Cache) SetBytes(key string, value []byte, ttl time.Duration) error
- func (c *Cache) SetBytesContext(ctx context.Context, key string, value []byte, ttl time.Duration) error
- func (c *Cache) SetString(key string, value string, ttl time.Duration) error
- func (c *Cache) SetStringContext(ctx context.Context, key string, value string, ttl time.Duration) error
- func (c *Cache) Store() cachecore.Store
- func (c *Cache) TryLock(key string, ttl time.Duration) (bool, error)
- func (c *Cache) TryLockContext(ctx context.Context, key string, ttl time.Duration) (bool, error)
- func (c *Cache) Unlock(key string) error
- func (c *Cache) UnlockContext(ctx context.Context, key string) error
- func (c *Cache) WithObserver(o Observer) *Cache
- type CacheAPI
- type CompressionCodec
- type CoreAPI
- type CounterAPI
- type LockAPI
- type LockHandle
- func (l *LockHandle) Acquire() (bool, error)
- func (l *LockHandle) AcquireContext(ctx context.Context) (bool, error)
- func (l *LockHandle) Block(timeout, retryInterval time.Duration, fn func() error) (bool, error)
- func (l *LockHandle) BlockContext(ctx context.Context, retryInterval time.Duration, ...) (bool, error)
- func (l *LockHandle) Get(fn func() error) (bool, error)
- func (l *LockHandle) GetContext(ctx context.Context, fn func(context.Context) error) (bool, error)
- func (l *LockHandle) Release() error
- func (l *LockHandle) ReleaseContext(ctx context.Context) error
- type Observer
- type ObserverFunc
- type RateLimitAPI
- type RateLimitStatus
- type ReadAPI
- type RefreshAheadAPI
- type RememberAPI
- type StoreConfig
- type ValueCodec
- type WriteAPI
Constants ¶
const ( CompressionNone = cachecore.CompressionNone CompressionGzip = cachecore.CompressionGzip CompressionSnappy = cachecore.CompressionSnappy )
Variables ¶
Functions ¶
func Get ¶
Get returns a typed value for key using the default codec (JSON) when present. @group Reads
Example: get typed values (struct + string)
type Profile struct { Name string `json:"name"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = cache.Set(c, "profile:42", Profile{Name: "Ada"}, time.Minute)
_ = cache.Set(c, "settings:mode", "dark", time.Minute)
profile, ok, err := cache.Get[Profile](c, "profile:42")
mode, ok2, err2 := cache.Get[string](c, "settings:mode")
fmt.Println(err == nil, ok, profile.Name, err2 == nil, ok2, mode) // true true Ada true true dark
func GetContext ¶ added in v0.1.5
GetContext is the context-aware variant of Get. @group Reads
func GetJSON ¶
GetJSON decodes a JSON value into T when key exists, using background context. @group Reads
Example: get typed JSON
type Profile struct { Name string `json:"name"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = cache.SetJSON(c, "profile:42", Profile{Name: "Ada"}, time.Minute)
profile, ok, err := cache.GetJSON[Profile](c, "profile:42")
fmt.Println(err == nil, ok, profile.Name) // true true Ada
func GetJSONContext ¶ added in v0.1.5
GetJSONContext is the context-aware variant of GetJSON. @group Reads
func NewFileStore ¶
NewFileStore is a convenience for a filesystem-backed store. @group Constructors
Example: file helper
ctx := context.Background() store := cache.NewFileStore(ctx, "/tmp/my-cache") fmt.Println(store.Driver()) // file
func NewFileStoreWithConfig ¶
func NewFileStoreWithConfig(ctx context.Context, cfg StoreConfig) cachecore.Store
NewFileStoreWithConfig builds a filesystem-backed store using explicit root config. @group Constructors
Example: file helper with root config
ctx := context.Background()
store := cache.NewFileStoreWithConfig(ctx, cache.StoreConfig{
BaseConfig: cachecore.BaseConfig{
EncryptionKey: []byte("01234567890123456789012345678901"),
MaxValueBytes: 4096,
Compression: cache.CompressionGzip,
},
FileDir: "/tmp/my-cache",
})
fmt.Println(store.Driver()) // file
func NewMemoStore ¶
NewMemoStore decorates store with per-process read memoization.
Behavior:
- First Get hits the backing store, clones the value, and memoizes it in-process.
- Subsequent Get for the same key returns the memoized clone (no backend call).
- Any write/delete/flush invalidates the memo entry so local reads stay in sync with changes made through this process.
- Memo data is per-process only; other processes or external writers will not invalidate it. Use only when that staleness window is acceptable.
@group Memoization
Example: memoize a backing store
ctx := context.Background() base := cache.NewMemoryStore(ctx) memo := cache.NewMemoStore(base) c := cache.NewCache(memo) fmt.Println(c.Driver()) // memory
func NewMemoryStore ¶
NewMemoryStore is a convenience for an in-process store using defaults. @group Constructors
Example: memory helper
ctx := context.Background() store := cache.NewMemoryStore(ctx) fmt.Println(store.Driver()) // memory
func NewMemoryStoreWithConfig ¶
func NewMemoryStoreWithConfig(ctx context.Context, cfg StoreConfig) cachecore.Store
NewMemoryStoreWithConfig builds an in-process store using explicit root config. @group Constructors
Example: memory helper with root config
ctx := context.Background()
store := cache.NewMemoryStoreWithConfig(ctx, cache.StoreConfig{
BaseConfig: cachecore.BaseConfig{
DefaultTTL: 30 * time.Second,
Compression: cache.CompressionGzip,
},
MemoryCleanupInterval: 5 * time.Minute,
})
fmt.Println(store.Driver()) // memory
func NewNullStore ¶
NewNullStore is a no-op store useful for tests where caching should be disabled. @group Constructors
Example: null helper
ctx := context.Background() store := cache.NewNullStore(ctx) fmt.Println(store.Driver()) // null
func NewNullStoreWithConfig ¶
func NewNullStoreWithConfig(ctx context.Context, cfg StoreConfig) cachecore.Store
NewNullStoreWithConfig builds a null store with shared wrappers (compression/encryption/limits). @group Constructors
Example: null helper with shared wrappers enabled
ctx := context.Background()
store := cache.NewNullStoreWithConfig(ctx, cache.StoreConfig{
BaseConfig: cachecore.BaseConfig{
Compression: cache.CompressionGzip,
MaxValueBytes: 1024,
},
})
fmt.Println(store.Driver()) // null
func Pull ¶
Pull returns a typed value for key and removes it, using the default codec (JSON). @group Invalidation
Example: pull typed value
type Token struct { Value string `json:"value"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = cache.Set(c, "reset:token:42", Token{Value: "abc"}, time.Minute)
tok, ok, err := cache.Pull[Token](c, "reset:token:42")
fmt.Println(err == nil, ok, tok.Value) // true true abc
func PullContext ¶ added in v0.1.5
PullContext is the context-aware variant of Pull. @group Invalidation
func RefreshAhead ¶
func RefreshAhead[T any](cache *Cache, key string, ttl, refreshAhead time.Duration, fn func() (T, error)) (T, error)
RefreshAhead returns a typed value and refreshes asynchronously when near expiry. @group Refresh Ahead
Example: refresh ahead typed
type Summary struct { Text string `json:"text"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
s, err := cache.RefreshAhead[Summary](c, "dashboard:summary", time.Minute, 10*time.Second, func() (Summary, error) {
return Summary{Text: "ok"}, nil
})
fmt.Println(err == nil, s.Text) // true ok
func RefreshAheadContext ¶ added in v0.1.5
func RefreshAheadContext[T any](ctx context.Context, cache *Cache, key string, ttl, refreshAhead time.Duration, fn func(context.Context) (T, error)) (T, error)
RefreshAheadContext is the context-aware variant of RefreshAhead. @group Refresh Ahead
func RefreshAheadValueWithCodec ¶
func RefreshAheadValueWithCodec[T any](ctx context.Context, cache *Cache, key string, ttl, refreshAhead time.Duration, fn func() (T, error), codec ValueCodec[T]) (T, error)
RefreshAheadValueWithCodec allows custom encoding/decoding for typed refresh-ahead operations. @group Refresh Ahead
func Remember ¶
Remember is the ergonomic, typed remember helper using JSON encoding by default. @group Read Through
Example: remember typed value
type Profile struct { Name string `json:"name"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
profile, err := cache.Remember[Profile](c, "profile:42", time.Minute, func() (Profile, error) {
return Profile{Name: "Ada"}, nil
})
fmt.Println(err == nil, profile.Name) // true Ada
func RememberContext ¶ added in v0.1.5
func RememberContext[T any](ctx context.Context, cache *Cache, key string, ttl time.Duration, fn func(context.Context) (T, error)) (T, error)
RememberContext is the context-aware variant of Remember. @group Read Through
func RememberStale ¶
func RememberStale[T any](cache *Cache, key string, ttl, staleTTL time.Duration, fn func() (T, error)) (T, bool, error)
RememberStale returns a typed value with stale fallback semantics using JSON encoding by default. @group Read Through
Example: remember stale typed
type Profile struct { Name string `json:"name"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
profile, usedStale, err := cache.RememberStale[Profile](c, "profile:42", time.Minute, 10*time.Minute, func() (Profile, error) {
return Profile{Name: "Ada"}, nil
})
fmt.Println(err == nil, usedStale, profile.Name) // true false Ada
func RememberStaleContext ¶ added in v0.1.5
func RememberStaleContext[T any](ctx context.Context, cache *Cache, key string, ttl, staleTTL time.Duration, fn func(context.Context) (T, error)) (T, bool, error)
RememberStaleContext returns a typed value with stale fallback semantics using JSON encoding by default. @group Read Through
Example: remember stale typed with context
type Profile struct { Name string `json:"name"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
profile, usedStale, err := cache.RememberStaleContext[Profile](ctx, c, "profile:42", time.Minute, 10*time.Minute, func(ctx context.Context) (Profile, error) {
return Profile{Name: "Ada"}, nil
})
fmt.Println(err == nil, usedStale, profile.Name) // true false Ada
func Set ¶
Set encodes value with the default codec (JSON) and writes it to key. @group Writes
Example: set typed values (struct + string)
type Settings struct { Enabled bool `json:"enabled"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
err := cache.Set(c, "settings:alerts", Settings{Enabled: true}, time.Minute)
err2 := cache.Set(c, "settings:mode", "dark", time.Minute)
fmt.Println(err == nil, err2 == nil) // true true
func SetContext ¶ added in v0.1.5
func SetContext[T any](ctx context.Context, cache *Cache, key string, value T, ttl time.Duration) error
SetContext is the context-aware variant of Set. @group Writes
func SetJSON ¶
SetJSON encodes value as JSON and writes it to key using background context. @group Writes
Example: set typed JSON
type Settings struct { Enabled bool `json:"enabled"` }
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
err := cache.SetJSON(c, "settings:alerts", Settings{Enabled: true}, time.Minute)
fmt.Println(err == nil) // true
Types ¶
type Cache ¶
type Cache struct {
// contains filtered or unexported fields
}
Cache provides an ergonomic cache API on top of Store.
func NewCache ¶
NewCache creates a cache facade bound to a concrete store. @group Core
Example: cache from store
ctx := context.Background() s := cache.NewMemoryStore(ctx) c := cache.NewCache(s) fmt.Println(c.Driver()) // memory
func NewCacheWithTTL ¶
NewCacheWithTTL lets callers override the default TTL applied when ttl <= 0. @group Core
Example: cache with custom default TTL
ctx := context.Background() s := cache.NewMemoryStore(ctx) c := cache.NewCacheWithTTL(s, 2*time.Minute) fmt.Println(c.Driver(), c != nil) // memory true
func (*Cache) Add ¶
Add writes value only when key is not already present. @group Writes
Example: add once
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
created, _ := c.Add("boot:seeded", []byte("1"), time.Hour)
fmt.Println(created) // true
func (*Cache) AddContext ¶ added in v0.1.5
func (c *Cache) AddContext(ctx context.Context, key string, value []byte, ttl time.Duration) (bool, error)
AddContext is the context-aware variant of Add. @group Writes
func (*Cache) BatchGetBytes ¶
BatchGetBytes returns all found values for the provided keys. Missing keys are omitted from the returned map. @group Reads
Example: batch get keys
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = c.SetBytes("a", []byte("1"), time.Minute)
_ = c.SetBytes("b", []byte("2"), time.Minute)
values, err := c.BatchGetBytes("a", "b", "missing")
fmt.Println(err == nil, string(values["a"]), string(values["b"])) // true 1 2
func (*Cache) BatchGetBytesContext ¶ added in v0.1.5
func (c *Cache) BatchGetBytesContext(ctx context.Context, keys ...string) (map[string][]byte, error)
BatchGetBytesContext is the context-aware variant of BatchGetBytes. @group Reads
func (*Cache) BatchSetBytes ¶
BatchSetBytes writes many key/value pairs using a shared ttl. @group Writes
Example: batch set keys
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
err := c.BatchSetBytes(map[string][]byte{
"a": []byte("1"),
"b": []byte("2"),
}, time.Minute)
fmt.Println(err == nil) // true
func (*Cache) BatchSetBytesContext ¶ added in v0.1.5
func (c *Cache) BatchSetBytesContext(ctx context.Context, values map[string][]byte, ttl time.Duration) error
BatchSetBytesContext is the context-aware variant of BatchSetBytes. @group Writes
func (*Cache) Decrement ¶
Decrement decrements a numeric value and returns the result. @group Writes
Example: decrement counter
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
val, _ := c.Decrement("rate:login:42", 1, time.Minute)
fmt.Println(val) // -1
func (*Cache) DecrementContext ¶ added in v0.1.5
func (c *Cache) DecrementContext(ctx context.Context, key string, delta int64, ttl time.Duration) (int64, error)
DecrementContext is the context-aware variant of Decrement. @group Writes
func (*Cache) Delete ¶
Delete removes a single key. @group Invalidation
Example: delete key
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = c.SetBytes("a", []byte("1"), time.Minute)
fmt.Println(c.Delete("a") == nil) // true
func (*Cache) DeleteContext ¶ added in v0.1.5
DeleteContext is the context-aware variant of Delete. @group Invalidation
func (*Cache) DeleteMany ¶
DeleteMany removes multiple keys. @group Invalidation
Example: delete many keys
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
fmt.Println(c.DeleteMany("a", "b") == nil) // true
func (*Cache) DeleteManyContext ¶ added in v0.1.5
DeleteManyContext is the context-aware variant of DeleteMany. @group Invalidation
func (*Cache) Flush ¶
Flush clears all keys for this store scope. @group Invalidation
Example: flush all keys
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = c.SetBytes("a", []byte("1"), time.Minute)
fmt.Println(c.Flush() == nil) // true
func (*Cache) FlushContext ¶ added in v0.1.5
FlushContext is the context-aware variant of Flush. @group Invalidation
func (*Cache) GetBytes ¶
GetBytes returns raw bytes for key when present. @group Reads
Example: get bytes
ctx := context.Background()
s := cache.NewMemoryStore(ctx)
c := cache.NewCache(s)
_ = c.SetBytes("user:42", []byte("Ada"), 0)
value, ok, _ := c.GetBytes("user:42")
fmt.Println(ok, string(value)) // true Ada
func (*Cache) GetBytesContext ¶ added in v0.1.5
GetBytesContext is the context-aware variant of GetBytes. @group Reads
func (*Cache) GetString ¶
GetString returns a UTF-8 string value for key when present. @group Reads
Example: get string
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = c.SetString("user:42:name", "Ada", 0)
name, ok, _ := c.GetString("user:42:name")
fmt.Println(ok, name) // true Ada
func (*Cache) GetStringContext ¶ added in v0.1.5
GetStringContext is the context-aware variant of GetString. @group Reads
func (*Cache) Increment ¶
Increment increments a numeric value and returns the result. @group Writes
Example: increment counter
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
val, _ := c.Increment("rate:login:42", 1, time.Minute)
fmt.Println(val) // 1
func (*Cache) IncrementContext ¶ added in v0.1.5
func (c *Cache) IncrementContext(ctx context.Context, key string, delta int64, ttl time.Duration) (int64, error)
IncrementContext is the context-aware variant of Increment. @group Writes
func (*Cache) Lock ¶
Lock waits until the lock is acquired or timeout elapses. @group Locking
Example: lock with timeout
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
locked, err := c.Lock("job:sync", 10*time.Second, time.Second)
fmt.Println(err == nil, locked) // true true
func (*Cache) LockContext ¶ added in v0.1.5
func (c *Cache) LockContext(ctx context.Context, key string, ttl, retryInterval time.Duration) (bool, error)
LockContext retries lock acquisition until success or context cancellation. @group Locking
func (*Cache) NewLockHandle ¶
func (c *Cache) NewLockHandle(key string, ttl time.Duration) *LockHandle
NewLockHandle creates a reusable lock handle for a key/ttl pair. @group Locking
Example: lock handle acquire/release
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
lock := c.NewLockHandle("job:sync", 10*time.Second)
locked, err := lock.Acquire()
fmt.Println(err == nil, locked) // true true
if locked {
_ = lock.Release()
}
func (*Cache) PullBytes ¶
PullBytes returns value and removes it from cache. @group Invalidation
Example: pull and delete
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = c.SetString("reset:token:42", "abc", time.Minute)
body, ok, _ := c.PullBytes("reset:token:42")
fmt.Println(ok, string(body)) // true abc
func (*Cache) PullBytesContext ¶ added in v0.1.5
PullBytesContext is the context-aware variant of PullBytes. @group Invalidation
func (*Cache) RateLimit ¶
RateLimit increments a fixed-window counter and returns allowance metadata. @group Rate Limiting
Example: fixed-window rate limit metadata
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
res, err := c.RateLimit("rl:api:ip:1.2.3.4", 100, time.Minute)
fmt.Println(err == nil, res.Allowed, res.Count, res.Remaining, !res.ResetAt.IsZero())
// Output: true true 1 99 true
func (*Cache) RateLimitContext ¶ added in v0.1.5
func (c *Cache) RateLimitContext(ctx context.Context, key string, limit int64, window time.Duration) (RateLimitStatus, error)
RateLimitContext is the context-aware variant of RateLimit. @group Rate Limiting
func (*Cache) Ready ¶ added in v0.1.4
Ready checks whether the underlying store is ready to serve requests. @group Core
Example: readiness probe
ctx := context.Background() c := cache.NewCache(cache.NewMemoryStore(ctx)) fmt.Println(c.Ready() == nil) // true
func (*Cache) ReadyContext ¶ added in v0.1.5
ReadyContext is the context-aware variant of Ready. @group Core
func (*Cache) RefreshAheadBytes ¶
func (c *Cache) RefreshAheadBytes(key string, ttl, refreshAhead time.Duration, fn func() ([]byte, error)) ([]byte, error)
RefreshAheadBytes returns cached value immediately and refreshes asynchronously when near expiry. On miss, it computes and stores synchronously. @group Refresh Ahead
Example: refresh ahead
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
body, err := c.RefreshAheadBytes("dashboard:summary", time.Minute, 10*time.Second, func() ([]byte, error) {
return []byte("payload"), nil
})
fmt.Println(err == nil, len(body) > 0) // true true
func (*Cache) RefreshAheadBytesContext ¶ added in v0.1.5
func (c *Cache) RefreshAheadBytesContext(ctx context.Context, key string, ttl, refreshAhead time.Duration, fn func(context.Context) ([]byte, error)) ([]byte, error)
RefreshAheadBytesContext is the context-aware variant of RefreshAheadBytes. @group Refresh Ahead
func (*Cache) RememberBytes ¶
func (c *Cache) RememberBytes(key string, ttl time.Duration, fn func() ([]byte, error)) ([]byte, error)
RememberBytes returns key value or computes/stores it when missing. @group Read Through
Example: remember bytes
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
data, err := c.RememberBytes("dashboard:summary", time.Minute, func() ([]byte, error) {
return []byte("payload"), nil
})
fmt.Println(err == nil, string(data)) // true payload
func (*Cache) RememberBytesContext ¶ added in v0.1.5
func (c *Cache) RememberBytesContext(ctx context.Context, key string, ttl time.Duration, fn func(context.Context) ([]byte, error)) ([]byte, error)
RememberBytesContext is the context-aware variant of RememberBytes. @group Read Through
func (*Cache) RememberStaleBytes ¶
func (c *Cache) RememberStaleBytes(key string, ttl, staleTTL time.Duration, fn func() ([]byte, error)) ([]byte, bool, error)
RememberStaleBytes returns a fresh value when available, otherwise computes and caches it. If computing fails and a stale value exists, it returns the stale value. The returned bool is true when a stale fallback was used. @group Read Through
Example: stale fallback on upstream failure
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
body, usedStale, err := c.RememberStaleBytes("profile:42", time.Minute, 10*time.Minute, func() ([]byte, error) {
return []byte(`{"name":"Ada"}`), nil
})
fmt.Println(err == nil, usedStale, len(body) > 0)
func (*Cache) RememberStaleBytesContext ¶ added in v0.1.5
func (c *Cache) RememberStaleBytesContext(ctx context.Context, key string, ttl, staleTTL time.Duration, fn func(context.Context) ([]byte, error)) ([]byte, bool, error)
RememberStaleBytesContext is the context-aware variant of RememberStaleBytes. @group Read Through
func (*Cache) SetBytes ¶
SetBytes writes raw bytes to key. @group Writes
Example: set bytes with ttl
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
fmt.Println(c.SetBytes("token", []byte("abc"), time.Minute) == nil) // true
func (*Cache) SetBytesContext ¶ added in v0.1.5
func (c *Cache) SetBytesContext(ctx context.Context, key string, value []byte, ttl time.Duration) error
SetBytesContext is the context-aware variant of SetBytes. @group Writes
func (*Cache) SetString ¶
SetString writes a string value to key. @group Writes
Example: set string
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
fmt.Println(c.SetString("user:42:name", "Ada", time.Minute) == nil) // true
func (*Cache) SetStringContext ¶ added in v0.1.5
func (c *Cache) SetStringContext(ctx context.Context, key string, value string, ttl time.Duration) error
SetStringContext is the context-aware variant of SetString. @group Writes
func (*Cache) Store ¶
Store returns the underlying store implementation. @group Core
Example: access store
ctx := context.Background() c := cache.NewCache(cache.NewMemoryStore(ctx)) fmt.Println(c.Store().Driver()) // memory
func (*Cache) TryLock ¶
TryLock acquires a short-lived lock key when not already held. @group Locking
Example: try lock
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
locked, _ := c.TryLock("job:sync", 10*time.Second)
fmt.Println(locked) // true
func (*Cache) TryLockContext ¶ added in v0.1.5
TryLockContext is the context-aware variant of TryLock. @group Locking
func (*Cache) Unlock ¶
Unlock releases a previously acquired lock key. @group Locking
Example: unlock key
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
locked, _ := c.TryLock("job:sync", 10*time.Second)
if locked {
_ = c.Unlock("job:sync")
}
func (*Cache) UnlockContext ¶ added in v0.1.5
UnlockContext is the context-aware variant of Unlock. @group Locking
func (*Cache) WithObserver ¶
WithObserver attaches an observer to receive operation events. @group Observability
Example: attach observer
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
c = c.WithObserver(cache.ObserverFunc(func(ctx context.Context, op, key string, hit bool, err error, dur time.Duration, driver cachecore.Driver) {
// See docs/production-guide.md for a real metrics recipe.
fmt.Println(op, driver, hit, err == nil)
_ = ctx
_ = key
_ = dur
}))
_, _, _ = c.GetBytes("profile:42")
type CacheAPI ¶
type CacheAPI interface {
CoreAPI
ReadAPI
WriteAPI
CounterAPI
RateLimitAPI
LockAPI
RememberAPI
RefreshAheadAPI
}
CacheAPI is the composed application-facing interface for Cache.
type CompressionCodec ¶
type CompressionCodec = cachecore.CompressionCodec
CompressionCodec represents a value compression algorithm.
type CoreAPI ¶
type CoreAPI interface {
Driver() cachecore.Driver
Ready() error
ReadyContext(ctx context.Context) error
}
CoreAPI exposes basic cache metadata.
type CounterAPI ¶
type CounterAPI interface {
Increment(key string, delta int64, ttl time.Duration) (int64, error)
IncrementContext(ctx context.Context, key string, delta int64, ttl time.Duration) (int64, error)
Decrement(key string, delta int64, ttl time.Duration) (int64, error)
DecrementContext(ctx context.Context, key string, delta int64, ttl time.Duration) (int64, error)
}
CounterAPI exposes increment/decrement operations.
type LockAPI ¶
type LockAPI interface {
TryLock(key string, ttl time.Duration) (bool, error)
TryLockContext(ctx context.Context, key string, ttl time.Duration) (bool, error)
Lock(key string, ttl, timeout time.Duration) (bool, error)
LockContext(ctx context.Context, key string, ttl, retryInterval time.Duration) (bool, error)
Unlock(key string) error
UnlockContext(ctx context.Context, key string) error
}
LockAPI exposes lock helpers based on cache keys.
type LockHandle ¶
type LockHandle struct {
// contains filtered or unexported fields
}
LockHandle provides ergonomic lock management on top of Cache lock helpers.
It wraps TryLock/Lock/Unlock and adds callback-based helpers.
Caveat:
- Release is a best-effort wrapper over Unlock and does not perform owner-token validation. Do not assume ownership safety after lock expiry.
@group Locking
func (*LockHandle) Acquire ¶
func (l *LockHandle) Acquire() (bool, error)
Acquire attempts to acquire the lock once (non-blocking). @group Locking
Example: single acquire attempt
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
lock := c.NewLockHandle("job:sync", 10*time.Second)
locked, err := lock.Acquire()
fmt.Println(err == nil, locked) // true true
func (*LockHandle) AcquireContext ¶ added in v0.1.5
func (l *LockHandle) AcquireContext(ctx context.Context) (bool, error)
AcquireContext is the context-aware variant of Acquire. @group Locking
func (*LockHandle) Block ¶
Block waits up to timeout to acquire the lock, runs fn if acquired, then releases.
retryInterval <= 0 falls back to the cache default lock retry interval. @group Locking
Example: wait for lock, then auto-release
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
lock := c.NewLockHandle("job:sync", 10*time.Second)
locked, err := lock.Block(500*time.Millisecond, 25*time.Millisecond, func() error {
// do protected work
return nil
})
fmt.Println(err == nil, locked) // true true
func (*LockHandle) BlockContext ¶ added in v0.1.5
func (l *LockHandle) BlockContext(ctx context.Context, retryInterval time.Duration, fn func(context.Context) error) (bool, error)
BlockContext is the context-aware variant of Block. @group Locking
func (*LockHandle) Get ¶
func (l *LockHandle) Get(fn func() error) (bool, error)
Get acquires the lock once, runs fn if acquired, then releases automatically. @group Locking
Example: acquire once and auto-release
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
lock := c.NewLockHandle("job:sync", 10*time.Second)
locked, err := lock.Get(func() error {
// do protected work
return nil
})
fmt.Println(err == nil, locked) // true true
func (*LockHandle) GetContext ¶ added in v0.1.5
GetContext is the context-aware variant of Get. @group Locking
func (*LockHandle) Release ¶
func (l *LockHandle) Release() error
Release unlocks the key if this handle previously acquired it.
It is safe to call multiple times; repeated calls become no-ops after the first successful release. @group Locking
Example: release a held lock
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
lock := c.NewLockHandle("job:sync", 10*time.Second)
locked, _ := lock.Acquire()
if locked {
_ = lock.Release()
}
func (*LockHandle) ReleaseContext ¶ added in v0.1.5
func (l *LockHandle) ReleaseContext(ctx context.Context) error
ReleaseContext is the context-aware variant of Release. @group Locking
type Observer ¶
type Observer interface {
OnCacheOp(ctx context.Context, op string, key string, hit bool, err error, dur time.Duration, driver cachecore.Driver)
}
Observer receives events for cache operations. It is called from Cache helpers after each operation completes.
type ObserverFunc ¶
type ObserverFunc func(ctx context.Context, op string, key string, hit bool, err error, dur time.Duration, driver cachecore.Driver)
ObserverFunc adapts a function to the Observer interface.
func (ObserverFunc) OnCacheOp ¶
func (f ObserverFunc) OnCacheOp(ctx context.Context, op string, key string, hit bool, err error, dur time.Duration, driver cachecore.Driver)
OnCacheOp implements Observer. @group Observability
Example: observer func callback
obs := cache.ObserverFunc(func(ctx context.Context, op, key string, hit bool, err error, dur time.Duration, driver cachecore.Driver) {
fmt.Println(op, key, hit, err == nil, driver)
_ = ctx
_ = dur
})
obs.OnCacheOp(context.Background(), "get", "user:42", true, nil, time.Millisecond, cachecore.DriverMemory)
type RateLimitAPI ¶
type RateLimitAPI interface {
RateLimit(key string, limit int64, window time.Duration) (RateLimitStatus, error)
RateLimitContext(ctx context.Context, key string, limit int64, window time.Duration) (RateLimitStatus, error)
}
RateLimitAPI exposes rate limiting helpers.
type RateLimitStatus ¶
RateLimitStatus contains fixed-window rate limiting metadata. @group Rate Limiting
type ReadAPI ¶
type ReadAPI interface {
GetBytes(key string) ([]byte, bool, error)
GetBytesContext(ctx context.Context, key string) ([]byte, bool, error)
BatchGetBytes(keys ...string) (map[string][]byte, error)
BatchGetBytesContext(ctx context.Context, keys ...string) (map[string][]byte, error)
GetString(key string) (string, bool, error)
GetStringContext(ctx context.Context, key string) (string, bool, error)
PullBytes(key string) ([]byte, bool, error)
PullBytesContext(ctx context.Context, key string) ([]byte, bool, error)
}
ReadAPI exposes read-oriented cache operations.
type RefreshAheadAPI ¶
type RefreshAheadAPI interface {
RefreshAheadBytes(key string, ttl, refreshAhead time.Duration, fn func() ([]byte, error)) ([]byte, error)
RefreshAheadBytesContext(ctx context.Context, key string, ttl, refreshAhead time.Duration, fn func(context.Context) ([]byte, error)) ([]byte, error)
}
RefreshAheadAPI exposes refresh-ahead helpers.
type RememberAPI ¶
type RememberAPI interface {
RememberBytes(key string, ttl time.Duration, fn func() ([]byte, error)) ([]byte, error)
RememberBytesContext(ctx context.Context, key string, ttl time.Duration, fn func(context.Context) ([]byte, error)) ([]byte, error)
RememberStaleBytes(key string, ttl, staleTTL time.Duration, fn func() ([]byte, error)) ([]byte, bool, error)
RememberStaleBytesContext(ctx context.Context, key string, ttl, staleTTL time.Duration, fn func(context.Context) ([]byte, error)) ([]byte, bool, error)
}
RememberAPI exposes remember and stale-remember helpers.
type StoreConfig ¶
type StoreConfig struct {
cachecore.BaseConfig
// MemoryCleanupInterval controls in-process cache eviction.
MemoryCleanupInterval time.Duration
// FileDir controls where file driver stores cache entries.
FileDir string
}
StoreConfig controls shared/root store construction settings.
type ValueCodec ¶
ValueCodec defines how to encode/decode typed values for helper operations.
type WriteAPI ¶
type WriteAPI interface {
SetBytes(key string, value []byte, ttl time.Duration) error
SetBytesContext(ctx context.Context, key string, value []byte, ttl time.Duration) error
SetString(key string, value string, ttl time.Duration) error
SetStringContext(ctx context.Context, key string, value string, ttl time.Duration) error
BatchSetBytes(values map[string][]byte, ttl time.Duration) error
BatchSetBytesContext(ctx context.Context, values map[string][]byte, ttl time.Duration) error
Add(key string, value []byte, ttl time.Duration) (bool, error)
AddContext(ctx context.Context, key string, value []byte, ttl time.Duration) (bool, error)
Delete(key string) error
DeleteContext(ctx context.Context, key string) error
DeleteMany(keys ...string) error
DeleteManyContext(ctx context.Context, keys ...string) error
Flush() error
FlushContext(ctx context.Context) error
}
WriteAPI exposes write and invalidation operations.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
cachecore
module
|
|
|
cachetest
module
|
|
|
driver
|
|
|
dynamocache
module
|
|
|
memcachedcache
module
|
|
|
mysqlcache
module
|
|
|
natscache
module
|
|
|
postgrescache
module
|
|
|
rediscache
module
|
|
|
sqlcore
module
|
|
|
sqlitecache
module
|