目录
前言与背景
Op定义及具体值获取
取PrevKvs、PrevKv注意事项
前言与背景
基于前文的封装,这里我们说明下PrevKV相关的定义及操作。
为了应对这样的需求:插入(更新)、删除某KV时,我们希望获得该key的上一个KV值,这时候就会用到该操作。
Op定义及具体值获取
要取得操作前的上一个Key和value的值,则需要在操作时带上必要的op(即...clientv3.OpOption):
1
2
3... 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值呢?
来看看源码中对响应的定义:
1
2
3
4
5
6
7type 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操作为:
1
2
3
4
5type 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获取
1
2resp.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定义及具体值获取内容请搜索靠谱客的其他文章。
发表评论 取消回复