64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package redis
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
type redisCache struct {
|
|
opts *options
|
|
}
|
|
|
|
func (c *redisCache) buildKey(key string) string {
|
|
return c.opts.prefix + key
|
|
}
|
|
|
|
func (c *redisCache) Load(ctx context.Context, key string, val any) error {
|
|
var (
|
|
err error
|
|
buf []byte
|
|
)
|
|
if buf, err = c.opts.client.Get(ctx, c.buildKey(key)).Bytes(); err == nil {
|
|
err = json.Unmarshal(buf, val)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (c *redisCache) Exists(ctx context.Context, key string) (ok bool, err error) {
|
|
var n int64
|
|
n, err = c.opts.client.Exists(ctx, c.buildKey(key)).Result()
|
|
if n > 0 {
|
|
ok = true
|
|
}
|
|
return
|
|
}
|
|
|
|
// Put stores a key-value pair into cache.
|
|
func (c *redisCache) Store(ctx context.Context, key string, val any, d time.Duration) error {
|
|
var (
|
|
err error
|
|
buf []byte
|
|
)
|
|
if buf, err = json.Marshal(val); err == nil {
|
|
err = c.opts.client.Set(ctx, c.buildKey(key), buf, d).Err()
|
|
}
|
|
return err
|
|
}
|
|
|
|
// Delete removes a key from cache.
|
|
func (c *redisCache) Delete(ctx context.Context, key string) error {
|
|
return c.opts.client.Del(ctx, c.buildKey(key)).Err()
|
|
}
|
|
|
|
// String returns the name of the implementation.
|
|
func (c *redisCache) String() string {
|
|
return "redis"
|
|
}
|
|
|
|
func NewCache(opts ...Option) *redisCache {
|
|
return &redisCache{
|
|
opts: newOptions(opts...),
|
|
}
|
|
}
|