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
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
|
|
}
|