使用tikv api tikv.NewRawKVClient 第一次查询有值,第二次及以后查询结果为nil

采用docker-cmpose 部署

version: '3.1'

services:
  pd0:
    image: pingcap/pd:latest
    ports:
      - "2379:2379"
      - "2380:2380"
    volumes:
      - ~/data:/data
    command:
      - --name=pd0
      - --client-urls=http://0.0.0.0:2379
      - --peer-urls=http://0.0.0.0:2380
      # pd0 需要写到hosts
      - --advertise-client-urls=http://pd0:2379
      - --advertise-peer-urls=http://pd0:2380
      - --data-dir=/data/pd0
      - --log-file=/data/logs/pd0.log
    restart: on-failure
  tikv0:
    image: pingcap/tikv:latest
    ports:
    - "20160:20160"
    volumes:
      - ~/data:/data
    command:
      - --addr=0.0.0.0:20160
      - --advertise-addr=127.0.0.1:20160
      - --data-dir=/data/tikv0
      - --pd=pd0:2379
      - --log-file=/data/logs/tikv0.log
    depends_on:
      - "pd0"
    restart: on-failure

以下是代码

// github.com/pingcap/tidb/store/tikv.NewRawKVClient

var cli, _ = lib.NewRawKVClient()    
func KeyValueQuery(key []byte) {
    // 第一次能查询到,第二次及以后查询不到值
        cli.Get(key)
       // 第一次方法调用即使get多次也可以获取
        cli.Get(key)
       // 即使我每次请求都新建一个client也只有第一次能够获取到value
        var cli, _ = lib.NewRawKVClient()
        cli.Get(key) // 第一次获取到value 后续请求不可以
}


连接日志:
    [2020/05/18 20:46:24.579 +08:00] [INFO] [client.go:141] ["[pd] create pd client with endpoints"] [pd-address="[127.0.0.1:2379]"]
    [2020/05/18 20:46:24.581 +08:00] [INFO] [base_client.go:226] ["[pd] update member urls"] [old-urls="[http://127.0.0.1:2379]"] [new-urls="[http://pd0:2379]"]
    [2020/05/18 20:46:24.581 +08:00] [INFO] [base_client.go:242] ["[pd] switch leader"] [new-leader=http://pd0:2379] [old-leader=]
    [2020/05/18 20:46:24.581 +08:00] [INFO] [base_client.go:92] ["[pd] init cluster id"] [cluster-id=6828030869354985468]

耗时明显下降
//有结果 
[INFO] 2020/05/18 21:04 200 3.293903ms 127.0.0.1 POST /key-value/single-prefix/batch
// 无结果,同一个key
[INFO] 2020/05/18 21:04 200 1.157425ms 127.0.0.1 POST /key-value/single-prefix/batch
// 无结果,同一个key
[INFO] 2020/05/18 21:04 200 768.36µs 127.0.0.1 POST /key-value/single-prefix/batch

重启我的(应用)服务后又可以查询一次

请问应该怎么使用这个api?

稍等,会尽快答复

非常感谢

我有个疑问啊,上面贴的只是示意代码,不是原始代码吧?因为代码里没看到像下面贴的那种日志。 能否把原始代码贴一下?另外最好提供一下所依赖的tidb的代码的版本号/hash码。

稍等现给 tidb代码的版本号和hash码

github.com/pingcap/tidb v1.1.0-beta.0.20200509081805-c258afafe241

我想给你们提供一个示例程序但是我发现tidb这个包有升级

新的版本:
github.com/pingcap/tidb v1.1.0-beta.0.20200518163139-06f16d58d9d1
并且新增了若干新的依赖
启动报错:
# go.etcd.io/etcd/clientv3/balancer/picker
../../go/pkg/mod/go.etcd.io/etcd@v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/clientv3/balancer/picker/err.go:37:44: undefined: balancer.PickOptions
../../go/pkg/mod/go.etcd.io/etcd@v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/clientv3/balancer/picker/roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
# go.etcd.io/etcd/clientv3/balancer/resolver/endpoint
../../go/pkg/mod/go.etcd.io/etcd@v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/clientv3/balancer/resolver/endpoint/endpoint.go:114:78: undefined: resolver.BuildOption
../../go/pkg/mod/go.etcd.io/etcd@v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/clientv3/balancer/resolver/endpoint/endpoint.go:182:31: undefined: resolver.ResolveNowOption
原来的:
github.com/pingcap/tidb v1.1.0-beta.0.20200509081805-c258afafe241

你好,能不能再贴一下使用 rawkvclient 的具体代码(而不是示意代码)?

非常感谢,我在整理demo的过程中发现是我的问题(key会经过hmac → base64 之后才去 tikv查询,我发现同一个key多次请求生成的字节不一致。之前完全没预料到会产生这种变化 )。
每次重启 第一次请求的生成的key会和我存进tikv key一致,后续请求会生成不同的key
很抱歉占用了你们宝贵的时间。

:monkey::monkey::monkey::monkey:

请一定原谅我。:innocent:

以下是罪魁祸首
var mac = hmac.New(sha256.New, []byte(“”))
mac.Write(key)
k := mac.Sum(nil)

	dst := make([]byte, base64.StdEncoding.EncodedLen(len(k)))
	base64.StdEncoding.Encode(dst, k)
	byteArray := [][]byte{prefix, dst}
	return bytes.Join(byteArray, kvSplitSymbol)

哈哈没事这很正常,happy hacking:grinning: