68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
package cache
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/XingfenD/yoresee_doc/pkg/storage"
|
|
"github.com/bytedance/sonic"
|
|
"github.com/redis/go-redis/v9"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func GetJSON(ctx context.Context, key string, dst interface{}) (bool, error) {
|
|
b, err := storage.KVS.Get(ctx, key).Bytes()
|
|
if err == redis.Nil {
|
|
return false, nil
|
|
}
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if err := sonic.Unmarshal(b, dst); err != nil {
|
|
return false, err
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func SetJSON(ctx context.Context, key string, v interface{}, ttl time.Duration) error {
|
|
b, err := sonic.Marshal(v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return storage.KVS.Set(ctx, key, b, ttl).Err()
|
|
}
|
|
|
|
func DeleteByPattern(ctx context.Context, pattern string) error {
|
|
iter := storage.KVS.Scan(ctx, 0, pattern, 100).Iterator()
|
|
for iter.Next(ctx) {
|
|
_ = storage.KVS.Del(ctx, iter.Val()).Err()
|
|
}
|
|
return iter.Err()
|
|
}
|
|
|
|
func DoubleDelete(ctx context.Context, writeDB func() error, keys ...string) error {
|
|
if err := deleteKeys(ctx, keys); err != nil {
|
|
logrus.Warn("First cache deletion failed: ", err)
|
|
}
|
|
|
|
if err := writeDB(); err != nil {
|
|
return err
|
|
}
|
|
|
|
go func() {
|
|
time.Sleep(100 * time.Millisecond)
|
|
if err := deleteKeys(ctx, keys); err != nil {
|
|
logrus.Warn("Second cache deletion failed: ", err)
|
|
}
|
|
}()
|
|
|
|
return nil
|
|
}
|
|
|
|
func deleteKeys(ctx context.Context, keys []string) error {
|
|
if len(keys) == 0 {
|
|
return nil
|
|
}
|
|
return storage.KVS.Del(ctx, keys...).Err()
|
|
}
|