etcd 使用: golang 例子

一:连接到 etcd

package main

import (
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "time"
)

//连接
func main() {
    //客户端配置
    config := clientv3.Config{
        Endpoints:   []string{"192.168.1.109:2379"},
        DialTimeout: 5 * time.Second,
    }

    //建立连接
    if client, err := clientv3.New(config); err != nil {
        fmt.Println(err)
        return
    }
 
   fmt.Println("connect success")
    defer client.Close()
}

二:存储 读取value

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "time"
)

func main() {
    client, err := clientv3.New(clientv3.Config{
        Endpoints:   []string{"192.168.1.109:2379", "192.168.1.109:2379"},
        DialTimeout: 5 * time.Second,
    })
    if err != nil {
        fmt.Println("connect failed, err :", err)
        return
    }

    defer client.Close()

    //访问etced,控制超时
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
   //存值
    _, err = client.Put(ctx, "/demo/demo1_key", "demo1_value")
    //操作完毕,取消etcd
    cancel()
    if err != nil {
        fmt.Println("put failed, err:", err)
        return
    }

    //获取值, 也设置超时
    ctx, cancel = context.WithTimeout(context.Background(), time.Second)
    resp, err := client.Get(ctx, "/demo/demo1_key")
    cancel()
    if err != nil {
        fmt.Println("get failed err:", err)
        return
    }

    for _, item := range resp.Kvs { //Kvs 返回key的列表
        fmt.Printf("%s : %s \n", item.Key, item.Value)
    }
}

三:watch 监听

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "time"
)

func main() {
    client, err := clientv3.New(clientv3.Config{
        Endpoints:   []string{"192.168.1.109:2379"},
        DialTimeout: time.Second,
    })
    if err != nil {
        fmt.Println("connect failed err : ", err)
        return
    }
    defer client.Close()

    client.Put(context.Background(), "/demo/demo2_key", "demo2_value")
    for {
        //watch
        watchKey := client.Watch(context.Background(), "/demo/demo2_key")
        for resp := range watchKey {
            for _, item := range resp {
                fmt.Printf("%s %q : %q \n", item.Type, item.Kv.key, item.Kv.Value)
            }
        }
    }
}

四:Transaction 事务

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "log"
    "sync"
    "time"
)

func main() {
    client, err := clientv3.New(clientv3.Config{
        Endpoints:   5 * time.Second,
        DialTimeout: 3 * time.Second,
    })
    if err != nil {
        fmt.Println("connect failed err: ", err)
        return
    }
    client.Close()

    var w sync.WaitGroup
    w.Add(10)
    key10 := "setnx"
    for i := 0; i < 10; i++ {
        go func(i int) {
            time.Sleep(5 * time.Millisecond)
            //通过key的Create_Revision 是否为 0 来判断key是否存在。其中If,Then 以及 Else 分支都可以包含多个操作。
            //返回的数据包含一个successed字段,当为 true 时代表 If 为真
            _, err := client.Txn(context.Background()).
                If(clientv3.Compare(clientv3.CreateRevision(key10), "=", 0)).
                Then(clientv3.OpPut(key10, fmt.Sprintf("%d", i))).
                Commit()
            if err != nil {
                fmt.Println(err)
            }

            w.Done()
        }(i)
    }
    w.Wait()

    if resp, err := client.Get(context.TODO(), key10); err != nil {
        log.Fatal(err)
    } else {
        log.Println(resp)
    }
}

转载于:https://www.cnblogs.com/jiujuan/p/10930664.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值