Documentation
¶
Index ¶
- Constants
- Variables
- func Get[T any](cache *Cache, key string) (T, bool, error)
- func GetJSON[T any](cache *Cache, key string) (T, bool, error)
- func ListPage(ctx context.Context, c *Cache, opts cachecore.ListPageOptions) (cachecore.ListPageResult, 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 RefreshAhead[T any](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 RememberStale[T any](cache *Cache, key string, ttl, staleTTL time.Duration, fn func() (T, error)) (T, bool, error)
- func Set[T any](cache *Cache, key string, value T, ttl time.Duration) error
- func SetJSON[T any](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) BatchGetBytes(keys ...string) (map[string][]byte, error)
- func (c *Cache) BatchSetBytes(values map[string][]byte, ttl time.Duration) error
- func (c *Cache) Decrement(key string, delta int64, ttl time.Duration) (int64, error)
- func (c *Cache) Delete(key string) error
- func (c *Cache) DeleteMany(keys ...string) error
- func (c *Cache) Driver() cachecore.Driver
- func (c *Cache) Flush() error
- func (c *Cache) GetBytes(key string) ([]byte, bool, error)
- func (c *Cache) GetString(key string) (string, bool, error)
- func (c *Cache) Increment(key string, delta int64, ttl time.Duration) (int64, error)
- func (c *Cache) Inspector() (cachecore.Inspector, bool)
- func (c *Cache) Lock(key string, ttl, timeout 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) RateLimit(key string, limit int64, window time.Duration) (RateLimitStatus, error)
- func (c *Cache) Ready() error
- func (c *Cache) RefreshAheadBytes(key string, ttl, refreshAhead time.Duration, fn func() ([]byte, error)) ([]byte, error)
- func (c *Cache) RememberBytes(key string, ttl time.Duration, fn func() ([]byte, error)) ([]byte, error)
- func (c *Cache) RememberStaleBytes(key string, ttl, staleTTL time.Duration, fn func() ([]byte, error)) ([]byte, bool, error)
- func (c *Cache) SetBytes(key string, value []byte, ttl time.Duration) error
- func (c *Cache) SetString(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) Unlock(key string) error
- func (c *Cache) WithContext(ctx context.Context) *Cache
- func (c *Cache) WithObserver(o Observer) *Cache
- type CacheAPI
- type CacheOpEvent
- type CompressionCodec
- type CoreAPI
- type CounterAPI
- type LockAPI
- type LockHandle
- 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 ¶
var ( ErrValueTooLarge = errors.New("cache: value exceeds max size") ErrUnsupportedCodec = errors.New("cache: unsupported compression codec") ErrCorruptCompression = errors.New("cache: corrupt compressed payload") )
var ( ErrEncryptionKey = errors.New("cache: encryption key must be 16, 24, or 32 bytes") ErrDecryptFailed = errors.New("cache: decrypt failed") ErrEncryptValueTooBig = errors.New("cache: encrypt value too large") )
var ErrInspectorUnsupported = errors.New("cache: inspector unsupported for this store")
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 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 ListPage ¶ added in v0.2.0
func ListPage(ctx context.Context, c *Cache, opts cachecore.ListPageOptions) (cachecore.ListPageResult, error)
ListPage lists cache entries from an inspector-capable store. @group Reads
Example: browse cache keys
ctx := context.Background()
c := cache.NewCache(cache.NewMemoryStore(ctx))
_ = c.SetString("profile:1", "Ada", time.Minute)
_ = c.SetString("profile:2", "Grace", time.Minute)
page, _ := cache.ListPage(ctx, c, cachecore.ListPageOptions{
Query: "profile:",
Limit: 10,
})
fmt.Println(len(page.Entries), page.Entries[0].Key) // 2 profile:1
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 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 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 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 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 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) Inspector ¶ added in v0.2.0
Inspector returns the optional browsing interface for the underlying store. @group Core
Example: detect inspector support
ctx := context.Background() c := cache.NewCache(cache.NewMemoryStore(ctx)) inspector, ok := c.Inspector() fmt.Println(ok, inspector.Capabilities().CanList) // true true
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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) WithContext ¶ added in v0.2.1
WithContext returns a derived cache handle that binds ctx to subsequent operations. @group Core
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 CacheOpEvent ¶ added in v0.3.0
type CompressionCodec ¶
type CompressionCodec = cachecore.CompressionCodec
CompressionCodec represents a value compression algorithm.
type CoreAPI ¶
type CoreAPI interface {
WithContext(ctx context.Context) *Cache
Driver() cachecore.Driver
Ready() error
}
CoreAPI exposes basic cache metadata.
type CounterAPI ¶
type CounterAPI interface {
Increment(key string, delta int64, ttl time.Duration) (int64, error)
Decrement(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)
Lock(key string, ttl, timeout time.Duration) (bool, error)
Unlock(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) 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) 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) 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) WithContext ¶ added in v0.2.1
func (l *LockHandle) WithContext(ctx context.Context) *LockHandle
type Observer ¶
type Observer interface {
OnCacheOp(ctx context.Context, event CacheOpEvent)
}
Observer receives events for cache operations. It is called from Cache helpers after each operation completes.
type ObserverFunc ¶
type ObserverFunc func(ctx context.Context, event CacheOpEvent)
ObserverFunc adapts a function to the Observer interface.
func (ObserverFunc) OnCacheOp ¶
func (f ObserverFunc) OnCacheOp(ctx context.Context, event CacheOpEvent)
OnCacheOp implements Observer. @group Observability
Example: observer func callback
obs := cache.ObserverFunc(func(ctx context.Context, event cache.CacheOpEvent) {
fmt.Println(event.Operation, event.Key, event.Hit, event.Err == nil, event.Driver)
_ = ctx
_ = event.Duration
})
obs.OnCacheOp(context.Background(), cache.CacheOpEvent{Operation: "get", Key: "user:42", Hit: true, Duration: time.Millisecond, Driver: cachecore.DriverMemory})
type RateLimitAPI ¶
type RateLimitAPI interface {
RateLimit(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)
BatchGetBytes(keys ...string) (map[string][]byte, error)
GetString(key string) (string, bool, error)
PullBytes(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)
}
RefreshAheadAPI exposes refresh-ahead helpers.
type RememberAPI ¶
type RememberAPI interface {
RememberBytes(key string, ttl time.Duration, fn func() ([]byte, error)) ([]byte, error)
RememberStaleBytes(key string, ttl, staleTTL time.Duration, fn func() ([]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
SetString(key string, value string, ttl time.Duration) error
BatchSetBytes(values map[string][]byte, ttl time.Duration) error
Add(key string, value []byte, ttl time.Duration) (bool, error)
Delete(key string) error
DeleteMany(keys ...string) error
Flush() 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
|