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

  1. package utils
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/util/gconv"
  7. )
  8. func DeleteKeys(ctx context.Context, pattern string) (int, error) {
  9. redis := g.Redis()
  10. var (
  11. cursor uint64
  12. totalKeys int
  13. batchSize = 100
  14. )
  15. g.Log().Debugf(ctx, "开始删除匹配模式 %q 的缓存键", pattern)
  16. for {
  17. result, err := redis.Do(ctx, "SCAN", cursor, "MATCH", pattern, "COUNT", batchSize)
  18. if err != nil {
  19. return totalKeys, fmt.Errorf("SCAN 失败: %v", err)
  20. }
  21. arr := result.Array()
  22. fmt.Println("arr:", arr)
  23. cursor = gconv.Uint64(arr[0])
  24. rawKeys := gconv.Strings(arr[1])
  25. var keys []string
  26. for _, k := range rawKeys {
  27. keys = append(keys, k)
  28. }
  29. fmt.Println("keys:", keys)
  30. if len(keys) > 0 {
  31. deleted, err := redis.Del(ctx, keys...)
  32. if err != nil {
  33. g.Log().Warningf(ctx, "缓存删除异常: %v", err)
  34. }
  35. totalKeys += int(deleted)
  36. g.Log().Debugf(ctx, "本次删除 %d/%d 个键", deleted, len(keys))
  37. }
  38. if cursor == 0 {
  39. break
  40. }
  41. }
  42. return totalKeys, nil
  43. }