Go 学习笔记(59)— Go 第三方库之 etcd/clientv3 封装为方法使用(建立连接、设置key-value、获取key-value、获取带前缀的key-value)

1. 示例 1

package main
import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "time"
)
// 写入读取
func SetGet() {
    // 配置 etcd ,创建客户端
    cli, err := clientv3.New(clientv3.Config{
        Endpoints:   []string{"127.0.0.1:2379"},
        DialTimeout: 5 * time.Second,
    })
    if err != nil {
        fmt.Println("connect failed, err:", err)
        return
    }
    defer cli.Close()
    // 存储
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    _, err = cli.Put(ctx, "/sample_key/name/", "sample_value_name")
    defer cancel()
    if err != nil {
        fmt.Println("put name failed, err:", err)
        return
    }
    // 存储
    ctx, cancel = context.WithTimeout(context.Background(), time.Second)
    _, err = cli.Put(ctx, "/sample_key/name/laixhe", "sample_value_name_laixhe")
    defer cancel()
    if err != nil {
        fmt.Println("put name failed, err:", err)
        return
    }
    // 存储 - 租约时间
    del, _:= cli.Grant(context.TODO(), 10) // 申请租约,10s后就会自动移除
    ctx, cancel = context.WithTimeout(context.Background(), time.Second)
    _, err = cli.Put(ctx, "/sample_key/name/del", "sample_value_name_del", clientv3.WithLease(del.ID))
    defer cancel()
    if err != nil {
        fmt.Println("put name failed, err:", err)
        return
    }
    // 获取
    ctx, cancel = context.WithTimeout(context.Background(), time.Second)
    resp, err := cli.Get(ctx, "/sample_key/name/")
    defer cancel()
    if err != nil {
        fmt.Println("get failed, err:", err)
        return
    }
    for _, ev := range resp.Kvs {
        fmt.Printf("get (/sample_key/name/) %s : %s\n", ev.Key, ev.Value)
    }
    // 获取前缀的 /sample_key/name/ 都返回
    ctx, cancel = context.WithTimeout(context.Background(), time.Second)
    resp, err = cli.Get(ctx, "/sample_key/name/", clientv3.WithPrefix())
    defer cancel()
    if err != nil {
        fmt.Println("get failed, err:", err)
        return
    }
    for _, ev := range resp.Kvs {
        fmt.Printf("get all (/sample_key/name/) - %s : %s\n", ev.Key, ev.Value)
    }
}

2. 示例 2

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/coreos/etcd/clientv3"
)

type Etcd struct {
	client *clientv3.Client
	kv     clientv3.KV
	lease  clientv3.Lease
}

// 全局单例
var (
	G_etcd *Etcd
)

// 初始化
func InitEtcd() (err error) {
	// 初始化配置
	config := clientv3.Config{
		Endpoints:   []string{"192.168.0.129:2379", "localhost:22379"}, // 集群地址
		DialTimeout: time.Duration(5) * time.Millisecond,               // 连接超时
	}

	// 建立连接
	client, err := clientv3.New(config)
	if err != nil {
		fmt.Println(err)
	}

	// 得到KV和Lease的API子集
	kv := clientv3.NewKV(client)
	lease := clientv3.NewLease(client)

	// 赋值单例
	G_etcd = &Etcd{
		client: client,
		kv:     kv,
		lease:  lease,
	}
	return
}

func (etcd *Etcd) GetKeyValue(key string) error {
	getResp, err := etcd.kv.Get(context.TODO(), key, clientv3.WithPrefix())
	if err != nil {
		fmt.Println(err)
	}

	// 遍历所有任务, 进行反序列化
	for _, kvPair := range getResp.Kvs {
		fmt.Println(kvPair)
	}
	return err
}

func (etcd *Etcd) PutKeyValue(key, value string) error {
	// 保存到etcd
	putResp, err := etcd.kv.Put(context.TODO(), key, value, clientv3.WithPrevKV())
	if err != nil {
		fmt.Println(err)
	}
	// 如果是更新, 那么返回旧值
	if putResp.PrevKv != nil {
		fmt.Println(putResp.PrevKv.Value)
	}
	return err
}

func (etcd *Etcd) DeleteKey(key string) error {
	// 从etcd中删除它
	delResp, err := etcd.kv.Delete(context.TODO(), key, clientv3.WithPrevKV())
	if err != nil {
		fmt.Println(err)
	}
	// 返回被删除的值
	if len(delResp.PrevKvs) != 0 {
		fmt.Println(delResp.PrevKvs[0].Value)
	}
	return err
}

func (etcd *Etcd) PutKeyWithLease(key string, timeout int64) (err error) {

	leaseGrantResp, err := etcd.lease.Grant(context.TODO(), timeout)
	if err != nil {
		return
	}

	// 租约ID
	leaseId := leaseGrantResp.ID
	_, err = etcd.kv.Put(context.TODO(), key, "", clientv3.WithLease(leaseId))
	if err != nil {
		return
	}
	return
}

func main() {
	InitEtcd()

	G_etcd.PutKeyValue("/demo/A/B", "hello world")
	G_etcd.GetKeyValue("/demo/A/B")
	G_etcd.DeleteKey("/demo/A/B")
	G_etcd.PutKeyWithLease("/demo/A/B", 100)
}


参考:
https://blog.csdn.net/c_circle/article/details/98473421
https://www.jianshu.com/p/3206e35677b4
https://www.cnblogs.com/sunlong88/p/11295424.html
https://segmentfault.com/a/1190000020868242?utm_source=tag-newest
https://gitbook.cn/books/5e7637996ba17a6d2c9a3352/index.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值