-
- 实现联合kv操作仅仅是为了将一连串的put, get, delete, txn组合,减少大量kv操作的代码量,单独写一样可以实现
-
- 联合kv操作和事务也有区别, 因为事务会对KeyValue对象添加条件, 而这里并没有.
-
- 代码中向相关注释,直接上代码
1.client初始化
package cli
var Cli *clientv3.Client
func GetCli() (err error) {
config := clientv3.Config{}
config.Endpoints = []string{"huawei:3001"}
config.DialTimeout = time.Second * 5
config.Username = "root"
config.Password = "123"
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"
)
func Op() {
cli.GetCli()
ops := []clientv3.Op{
clientv3.OpPut("/test/ops1", "123", clientv3.WithPrevKV()),
clientv3.OpPut("/test/ops2", "456", clientv3.WithPrevKV()),
clientv3.OpPut("/test/ops3", "789", clientv3.WithPrevKV()),
clientv3.OpGet("/test/ops1", clientv3.WithPrevKV()),
clientv3.OpGet("/test", clientv3.WithPrefix(), clientv3.WithPrevKV()),
clientv3.OpDelete("/test/ops2", clientv3.WithFromKey(), clientv3.WithPrevKV()),
}
for _, op := range ops {
switch {
case op.IsPut():
opResponse, err := cli.Cli.Do(context.TODO(), op)
if err != nil {
log.Fatalf("get opResponse failed!, err:%v\n", err)
}
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!