go.etcd.io/etcd/client/v3
是 etcd 的官方 Go 语言客户端库
etcd
提供了事务支持,可以将多个操作打包成一个事务进行原子性的执行。这保证了在分布式环境中的数据的一致性和可靠性。
package main
import (
"context"
"fmt"
"time"
"go.etcd.io/etcd/client/v3"
)
func main() {
// 连接etcd
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"localhost:2379"},
DialTimeout: 5 * time.Second,
})
if err != nil {
fmt.Printf("连接etcd失败: %v", err)
return
}
defer cli.Close()
key := "name"
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
// 创建key
_, err = cli.Put(ctx, key, "小明")
if err != nil {
fmt.Printf("创建失败: %v", err)
return
}
// 创建一个事务
transaction := cli.Txn(context.TODO())
// 设置事务条件
transaction.If(clientv3.Compare(clientv3.Value(key), "=", "小明"))
//满足执行
transaction.Then(clientv3.OpPut(key, "小黑"), clientv3.OpPut("names", "10"))
//不满足执行
transaction.Else(clientv3.OpPut(key, "大黑"))
// 执行事务
response, err := transaction.Commit()
if err != nil {
fmt.Printf("提交事务失败: %v", err)
return
}
// 判断事务是否成功
if response.Succeeded {
fmt.Println("提交成功")
} else {
fmt.Println("提交失败")
return
}
// 获取最新的key值
getResponse, err := cli.Get(context.TODO(), key)
if err != nil {
fmt.Printf("获取失败: %v", err)
return
}
// 打印结果
for _, ev := range getResponse.Kvs {
fmt.Printf("Key: %s, Value: %s\n", ev.Key, ev.Value)
}
}