概述
目录
前言与背景
Op定义及具体值获取
取PrevKvs、PrevKv注意事项
前言与背景
基于前文的封装,这里我们说明下PrevKV相关的定义及操作。
为了应对这样的需求:插入(更新)、删除某KV时,我们希望获得该key的上一个KV值,这时候就会用到该操作。
Op定义及具体值获取
要取得操作前的上一个Key和value的值,则需要在操作时带上必要的op(即...clientv3.OpOption):
...
kv := clientv3.NewKV(cli)
resp, err = kv.Delete(ctx, key, clientv3.WithPrevKV())
以上代码表示,在删除key时,通过clientv3.WithPrevKV()标记返回的结果中需要返回删除前的KV值(PUT操作意思一样);
源码中还提供了很多With功能,可根据实际需要来选择:
实际上就是给type Op struct这个结构的一些字段赋值进行标记。
位于go.etcd.ioetcd@v0.5.0-alpha.5.0.20200910180754-dd1b699fc489clientv3op.go
那么如何取得删除前的KV值呢?
来看看源码中对响应的定义:
type DeleteRangeResponse struct {
Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"`
// deleted is the number of keys deleted by the delete range request.
Deleted int64 `protobuf:"varint,2,opt,name=deleted,proto3" json:"deleted,omitempty"`
// if prev_kv is set in the request, the previous key-value pairs will be returned.
PrevKvs []*mvccpb.KeyValue `protobuf:"bytes,3,rep,name=prev_kvs,json=prevKvs" json:"prev_kvs,omitempty"`
}
因为删除有可能删的是指定key开头的系列KV,因此可以看到返回值中是PrevKvs而不是PrevKv,取值即resp.PrevKvs即可。
PUT操作为:
type PutResponse struct {
Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"`
// if prev_kv is set in the request, the previous key-value pair will be returned.
PrevKv *mvccpb.KeyValue `protobuf:"bytes,2,opt,name=prev_kv,json=prevKv" json:"prev_kv,omitempty"`
}
具体值PrevKv获取
resp.PrevKv.Key
resp.PrevKv.Value
默认是[]byte类型,如有需要可转为string.
取PrevKvs、PrevKv注意事项
获取删除前的PrevKvs 或者 PUT前的PrevKv看起来很方便,但也是有一定条件的,经过调查所得如下:
1,对于PUT操作,put过该key后再次put,相当于更新操作,此时PrevKv有值;对,key首次PUT时 PrevKv为空;
2,对于DELETE操作,该key存在时进行delete操作,此时PrevKvs有值,若去delete不存在的key,则返回的PrevKvs为空;
这里的空就是nil
最后
以上就是喜悦鱼为你收集整理的etcdv3实战·PrevKV说明及相关操作前言与背景Op定义及具体值获取 取PrevKvs、PrevKv注意事项的全部内容,希望文章能够帮你解决etcdv3实战·PrevKV说明及相关操作前言与背景Op定义及具体值获取 取PrevKvs、PrevKv注意事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复