You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

45 lines
1.0 KiB

package utils
import (
"context"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
func DeleteKeys(ctx context.Context, pattern string) (int, error) {
redis := g.Redis()
var (
cursor uint64
totalKeys int
batchSize = 100
)
g.Log().Debugf(ctx, "开始删除匹配模式 %q 的缓存键", pattern)
for {
result, err := redis.Do(ctx, "SCAN", cursor, "MATCH", pattern, "COUNT", batchSize)
if err != nil {
return totalKeys, fmt.Errorf("SCAN 失败: %v", err)
}
arr := result.Array()
fmt.Println("arr:", arr)
cursor = gconv.Uint64(arr[0])
rawKeys := gconv.Strings(arr[1])
var keys []string
for _, k := range rawKeys {
keys = append(keys, k)
}
fmt.Println("keys:", keys)
if len(keys) > 0 {
deleted, err := redis.Del(ctx, keys...)
if err != nil {
g.Log().Warningf(ctx, "缓存删除异常: %v", err)
}
totalKeys += int(deleted)
g.Log().Debugf(ctx, "本次删除 %d/%d 个键", deleted, len(keys))
}
if cursor == 0 {
break
}
}
return totalKeys, nil
}