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 mainimport ("context""fmt""time""github.com/coreos/etcd/clientv3"
)type Etcd struct {client *clientv3.Clientkv clientv3.KVlease 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 {// 保存到etcdputResp, 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}// 租约IDleaseId := 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
Go 学习笔记(59)— Go 第三方库之 etcd/clientv3 封装为方法使用(建立连接、设置key-value、获取key-value、获取带前缀的key-value)相关推荐
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...
- python3第三方库手册_python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑...
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件? 当我们点开下载页时, 一 ...
- Go 学习笔记(58)— Go 第三方库之 etcd/clientv3(连接客户端、PUT、GET、Lease、Op、Txn、Watch 基础概念说明)
1. 安装 Golang 的 Etcd 包 我们使用 v3 版本的 etcd client , 首先通过 go get 下载并编译安装 etcd clinet v3. go get -v github ...
- python学习笔记项目_python第三方库之Django学习笔记一
1.安装Django pip install Django 2.版本号查询 python -m django --version 3.创建项目 切换到你想创建项目的目录,执行命令:django-adm ...
- Python学习笔记:常用第三方模块3
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料
STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料 微雪课堂:http://www.waveshare.net/study/article-629-1.html 之前的正点原 ...
- Makefile学习笔记07|编译静态库并通过ifeq语句
Makefile学习笔记07|编译静态库并通过ifeq语句 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢. 这里是目录 本篇与上一篇有较多联系,有兴趣的可以先看上一 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- oracle事务数统计,【学习笔记】Oracle数据库收集统计信息的两种方法介绍案例
天萃荷净 分享一篇关于Oracle数据库收集统计信息的办法,Oracle DBMS_STATS与Oracle analyze使用方法案例 今天群里面讨论DBMS_STATS和analyze,这里进行了 ...
最新文章
- 2018我的Java高级工程师面试总结
- 永远的GetLong
- java创建线程哪种方法最好_Java创建线程的三种方法比较
- “3D几何与视觉技术”全球在线研讨会第三期
- innodb 索引 mysql_InnoDB索引实现
- 企业互联网+转型实战:如何进行PB级别数据的架构变迁
- 高等数学在线计算工具
- 翟菜花:国产游戏为什么还不适合出海“亮剑”
- 计算机被填充背景花束纹理在那,为艺术字设置纹理填充的两种方法
- 【opencv】动态背景下运动目标检测 SURF配准差分
- 修复打开Excel提示
- 手机有显示3g无法理解服务器,3G手机根本不需升级4G,一个技巧提高3倍网速!...
- 黑马编程开发各种免费资源-安排一下
- 百度搜索公正性彻底调查
- 底层之旅——Android显示驱动(framebuffer)的分析
- 什么是中控矩阵视屏监控系统
- build a better world系列——能不能好好让我买张高铁票
- ViewPager无限轮播,简单实现
- 局域网监控软件的功能分析1
- 100道软件测试练习题,看看你能有多少分