Go语言写的一个命令行小工具(批量查询/删除redis的key)

259 阅读1分钟

一个删除redis集群里面key的命令行小工具

需要带2个参数, 第1个是需要删除的文件(每个key为一行) 第2个是 查看还是删除 操作

命令行使用到的技术:

  1. flag支持命令行参数
  2. ioutil支持读取文本文件
  3. redis客户端支持操作redis集群
package main

import (
   "context"
   "flag"
   "fmt"
   "github.com/go-redis/redis/v8"
   "io/ioutil"
   "log"
   "strings"
)

var (
   ctx = context.Background()
)

func main() {

   var config string
   var option bool
   flag.StringVar(&config ,"c", "", "需要删除的txt文件名称")
   flag.BoolVar(&option,"o", false, "输入操作:true删除,false查看")
   flag.Parse()

   fmt.Println(config,option)
   if config == "" {
      log.Fatalln("err: ", "配置文件不能为空")
   }

   rdb := redis.NewClusterClient(&redis.ClusterOptions{
      Addrs: []string{"",""},
   })
   err2 := rdb.ForEachShard(ctx, func(ctx context.Context, shard *redis.Client) error {
      return shard.Ping(ctx).Err()
   })
   if err2 != nil {
      panic(err2)
   }
   log.Println(rdb.ClientGetName(ctx))
   fmt.Println("已运行init函数")

   //读取txt文件,由参数-c 传入
   file, err := ioutil.ReadFile(config)
   if err != nil {
      fmt.Println(err)
   }
   //log.Println(string(file))
   split := strings.Split(string(file), "\n")
   //fmt.Println(split)

   //删除还是查看,由参数-o 决定
   if option {
      for _, v := range split {
         if v != "" {
            int64S1, _ := rdb.Del(ctx, v).Result()
            if 1 != int64S1 {
               fmt.Println(int64S1, v)
            }
         }
      }
   } else {
      for _, v := range split {
         result, _ := rdb.Get(ctx, v).Result()
         fmt.Println(result)
      }
   }
   defer rdb.Close()

}