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)
}