golang etcd/clientv3实现Ops联合kv操作写入

    1. 实现联合kv操作仅仅是为了将一连串的put, get, delete, txn组合,减少大量kv操作的代码量,单独写一样可以实现
    1. 联合kv操作和事务也有区别, 因为事务会对KeyValue对象添加条件, 而这里并没有.
    1. 代码中向相关注释,直接上代码

1.client初始化

package cli
var Cli *clientv3.Client

func GetCli() (err error) {
	// 1. etcd连接配置
	config := clientv3.Config{}
	config.Endpoints = []string{"huawei:3001"}
	config.DialTimeout = time.Second * 5
	config.Username = "root"
	config.Password = "123"

	// 2. 获取cted cli对象
	Cli, err = clientv3.New(config)
	if err != nil {
		log.Fatalf("init etcd cli failed! err:%v", err)
	}
	log.Infoln("init etcd cli success!")
	return
}

2.OPS实现

package op

import (
	"context"
	"fmt"
	"third/database/etcd/cli"

	log "github.com/sirupsen/logrus"
	"go.etcd.io/etcd/clientv3"
)

/*
1.创建ops对象(kv操作集),这里的定义和单独使用kv操作没区别,但这里是为了实现put,get,del,txn一个联合kv操作.
		clientv3.OpDelete()		kv.Delete
		clientv3.OpGet			kv.Get
		clientv3.OpPut			kv.Put
		clientv3.OpTxn			kv.Txn
2.获取ops中的每个op作为参数传入client.Do()方法获取opResponse,使用opResponse的方法获取对应kv操作response

*/

func Op() {
	// 初始化cli连接
	cli.GetCli()

	// 1. 初始化ops
	ops := []clientv3.Op{
		// 携带prekey的put三个key
		clientv3.OpPut("/test/ops1", "123", clientv3.WithPrevKV()),
		clientv3.OpPut("/test/ops2", "456", clientv3.WithPrevKV()),
		clientv3.OpPut("/test/ops3", "789", clientv3.WithPrevKV()),

		// 携带prekv  get
		clientv3.OpGet("/test/ops1", clientv3.WithPrevKV()),

		// 携带prekv, 匹配前缀  get
		clientv3.OpGet("/test", clientv3.WithPrefix(), clientv3.WithPrevKV()),

		// 携带prekv,递增	delete
		clientv3.OpDelete("/test/ops2", clientv3.WithFromKey(), clientv3.WithPrevKV()),
	}

	// 2. 调用client.Do方法执行ops中的每个op
	for _, op := range ops {
		switch {
		case op.IsPut(): // 判断当前op的类型,根据不同op类型执行对应的操作
			// 获取opResponse
			opResponse, err := cli.Cli.Do(context.TODO(), op)
			if err != nil {
				log.Fatalf("get opResponse failed!, err:%v\n", err)
			}
			// 根据opResponse获取对应的kv操作response
			putResponse := opResponse.Put()
			fmt.Printf("put success! revision:%v\n", putResponse.Header.Revision)
		case op.IsGet():
			opResponse, err := cli.Cli.Do(context.TODO(), op)
			if err != nil {
				log.Fatalf("get opResponse failed!, err:%v\n", err)
			}
			getResponse := opResponse.Get()
			count := getResponse.Count
			kvs := getResponse.Kvs
			if count == 0 {
				log.Infof("get a nil kvs!, err:%v\n", err)
			}
			for k, v := range kvs {
				log.Infof("%v [key:%s  value:%s]\n", k, v.Key, v.Value)
			}
		case op.IsDelete():
			opResponse, err := cli.Cli.Do(context.TODO(), op)
			if err != nil {
				log.Fatalf("get opResponse failed!, err:%v\n", err)
			}
			deleteResponse := opResponse.Del()
			deleted := deleteResponse.Deleted
			prekvs := deleteResponse.PrevKvs
			if deleted == 0 {
				log.Fatalln("deleted nil!")
			}
			log.Infof("deleted num of key:%v\n", deleted)

			for k, v := range prekvs {
				log.Infof("%v [key:%s vaule:%s] deleted!\n", k, v.Key, v.Value)
			}

		}
	}
}

3. 执行结果

[root@tencent etcd]# go run main.go 
INFO[0000] init etcd cli success!                        source="cli.go:64"
put success! revision:60
put success! revision:61
put success! revision:62
INFO[0000] 0 [key:/test/ops1  value:123]                
INFO[0000] 0 [key:/test/ops1  value:123]                
INFO[0000] 1 [key:/test/ops2  value:456]                
INFO[0000] 2 [key:/test/ops3  value:789]                
INFO[0000] 3 [key:/test/test1  value:test1]             
INFO[0000] deleted num of key:3                         
INFO[0000] 0 [key:/test/ops2 vaule:456] deleted!        
INFO[0000] 1 [key:/test/ops3 vaule:789] deleted!        
INFO[0000] 2 [key:/test/test1 vaule:test1] deleted!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值