75f3dd141c
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CI and Release / lint-frontend (push) Has been cancelled
CI and Release / dockerfile-scan (push) Has been cancelled
CI and Release / test-frontend (push) Has been cancelled
CI and Release / lint-verification-agent (push) Has been cancelled
CI and Release / test-verification-agent (push) Has been cancelled
CI and Release / e2e-verification-agent (push) Has been cancelled
CI and Release / test-backend (push) Has been cancelled
CI and Release / build-dev-image (push) Has been cancelled
CI and Release / push-dev-image (push) Has been cancelled
CI and Release / build-image (push) Has been cancelled
CI and Release / build-verification-image (push) Has been cancelled
CI and Release / determine-version (push) Has been cancelled
CI and Release / push-image (push) Has been cancelled
CI and Release / push-verification-image (12) (push) Has been cancelled
CI and Release / lint-backend (push) Has been cancelled
CI and Release / push-verification-image (17) (push) Has been cancelled
CI and Release / push-verification-image (18) (push) Has been cancelled
CI and Release / release (push) Has been cancelled
CI and Release / publish-helm-chart (push) Has been cancelled
CI and Release / push-verification-image (13) (push) Has been cancelled
CI and Release / push-verification-image (14) (push) Has been cancelled
CI and Release / push-verification-image (15) (push) Has been cancelled
CI and Release / push-verification-image (16) (push) Has been cancelled
114 lines
2.3 KiB
Go
114 lines
2.3 KiB
Go
package cache_utils
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/valkey-io/valkey-go"
|
|
)
|
|
|
|
const (
|
|
DefaultCacheTimeout = 10 * time.Second
|
|
DefaultCacheExpiry = 10 * time.Minute
|
|
DefaultQueueTimeout = 30 * time.Second
|
|
)
|
|
|
|
type CacheUtil[T any] struct {
|
|
client valkey.Client
|
|
prefix string
|
|
timeout time.Duration
|
|
expiry time.Duration
|
|
}
|
|
|
|
func NewCacheUtil[T any](client valkey.Client, prefix string) *CacheUtil[T] {
|
|
return &CacheUtil[T]{
|
|
client: client,
|
|
prefix: prefix,
|
|
timeout: DefaultCacheTimeout,
|
|
expiry: DefaultCacheExpiry,
|
|
}
|
|
}
|
|
|
|
func (c *CacheUtil[T]) Get(key string) *T {
|
|
ctx, cancel := context.WithTimeout(context.Background(), c.timeout)
|
|
defer cancel()
|
|
|
|
fullKey := c.prefix + key
|
|
result := c.client.Do(ctx, c.client.B().Get().Key(fullKey).Build())
|
|
|
|
if result.Error() != nil {
|
|
return nil
|
|
}
|
|
|
|
data, err := result.AsBytes()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
var item T
|
|
if err := json.Unmarshal(data, &item); err != nil {
|
|
return nil
|
|
}
|
|
|
|
return &item
|
|
}
|
|
|
|
func (c *CacheUtil[T]) Set(key string, item *T) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), c.timeout)
|
|
defer cancel()
|
|
|
|
data, err := json.Marshal(item)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
fullKey := c.prefix + key
|
|
c.client.Do(ctx, c.client.B().Set().Key(fullKey).Value(string(data)).Ex(c.expiry).Build())
|
|
}
|
|
|
|
func (c *CacheUtil[T]) SetWithExpiration(key string, item *T, expiry time.Duration) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), c.timeout)
|
|
defer cancel()
|
|
|
|
data, err := json.Marshal(item)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
fullKey := c.prefix + key
|
|
c.client.Do(ctx, c.client.B().Set().Key(fullKey).Value(string(data)).Ex(expiry).Build())
|
|
}
|
|
|
|
func (c *CacheUtil[T]) GetAndDelete(key string) *T {
|
|
ctx, cancel := context.WithTimeout(context.Background(), c.timeout)
|
|
defer cancel()
|
|
|
|
fullKey := c.prefix + key
|
|
result := c.client.Do(ctx, c.client.B().Getdel().Key(fullKey).Build())
|
|
|
|
if result.Error() != nil {
|
|
return nil
|
|
}
|
|
|
|
data, err := result.AsBytes()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
var item T
|
|
if err := json.Unmarshal(data, &item); err != nil {
|
|
return nil
|
|
}
|
|
|
|
return &item
|
|
}
|
|
|
|
func (c *CacheUtil[T]) Invalidate(key string) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), c.timeout)
|
|
defer cancel()
|
|
|
|
fullKey := c.prefix + key
|
|
c.client.Do(ctx, c.client.B().Del().Key(fullKey).Build())
|
|
}
|