一架梯子,一头程序猿,仰望星空!

Go etcd增删改查(CRUD操作)


etcd是一个键值存储系统,类似ZooKeeper, key是以目录结构形式组织的,如下:

key的命名例子:

/tizi365
/tizi365/site/name
/tizi365/site/domain
/tizi365/status/urls

key以这种目录树结构方式存储,etcd支持前缀搜索,例如:搜索key 以 /tizi365 为前缀的所有键值。

下面介绍golang对etcd的基本操作。

1.写入数据

通过Put函数写入数据,如果Key存在则覆盖,否则新建一个。

cli, err := clientv3.New(...省略...)
if err != nil {
    log.Fatal(err)
}
defer cli.Close()

// 获取上下文,设置请求超时时间为5秒
ctx, _ := context.WithTimeout(context.Background(), 5 * time.Second)
// 设置key="/tizi365/url" 的值为 www.tizi365.com
_, err = cli.Put(ctx, "/tizi365/url", "www.tizi365.com")

if err != nil {
    log.Fatal(err)
}

提示,具体如何连接etcd请参考, 连接etcd章节

2.查询数据

通过Get函数,可以查询key的值

cli, err := clientv3.New(...省略...)
if err != nil {
    log.Fatal(err)
}
defer cli.Close()

// 获取上下文,设置请求超时时间为5秒
ctx, _ := context.WithTimeout(context.Background(), 5 * time.Second)
// 读取key="/tizi365/url" 的值
resp, err := cli.Get(ctx, "/tizi365/url")

if err != nil {
    log.Fatal(err)
}

// 虽然这个例子我们只是查询一个Key的值,
// 但是Get的查询结果可以表示多个Key的结果例如我们根据Key进行前缀匹配,Get函数可能会返回多个值。
for _, ev := range resp.Kvs {
    fmt.Printf("%s : %s\n", ev.Key, ev.Value)
}

3.前缀匹配

etcd支持key前缀匹配,Get,Delele函数都支持前缀匹配,只需要添加clientv3.WithPrefix()参数即可。

例子:

cli, err := clientv3.New(...省略...)
if err != nil {
    log.Fatal(err)
}
defer cli.Close()

// 获取上下文,设置请求超时时间为5秒
ctx, _ := context.WithTimeout(context.Background(), 5 * time.Second)

// 读取key前缀等于"/tizi365/"的所有值
resp, err := cli.Get(ctx, "/tizi365/", clientv3.WithPrefix())

if err != nil {
    log.Fatal(err)
}

// 遍历查询结果
for _, ev := range resp.Kvs {
    fmt.Printf("%s : %s\n", ev.Key, ev.Value)
}

4.删除数据

通过Delete函数删除数据

cli, err := clientv3.New(...省略...)
if err != nil {
    log.Fatal(err)
}
defer cli.Close()

// 获取上下文,设置请求超时时间为5秒
ctx, _ := context.WithTimeout(context.Background(), 5 * time.Second)
// 删除key="/tizi365/url" 的值
_, err = cli. Delete(ctx, "/tizi365/url")

if err != nil {
    log.Fatal(err)
}

// 批量删除key以"/tizi365/"为前缀的值
// 加上clientv3.WithPrefix()参数代表key前缀匹配的意思
_, err = cli. Delete(ctx, "/tizi365/", clientv3.WithPrefix())
if err != nil {
    log.Fatal(err)
}