Tikv client Iterator和tidbkv Iterator的区别

开发问题

最近在应用开发时同时使用了tikv txn client(“github.com/tikv/client-go/v2/txnkv/transaction”) Iterator和tidbkv(“github.com/pingcap/tidb/kv”) Iterator,发现他们的功能类似。比如,如果我要从某个checkpoint在某个KeyRange上进行Iteration,对于前者,可以写出类似如下的代码:

import (
  "github.com/tikv/client-go/v2/txnkv"
  "github.com/tikv/client-go/v2/tikv"
)
 
  client, _ := txnkv.NewClient(pdAddrs)
  txnOptions := txnOption{tikv.WithStartTS(checkpoint)}
  txn, _ := client.Begin(txnOptions...)
  iterator := txn.Iter(keyRange.Begin, keyRange.End)

对于后者可以写出如下的代码:

import (
  tidbkv "github.com/pingcap/tidb/kv"

  cdckv "github.com/pingcap/tiflow/cdc/kv"
)
storage := cdckv.CreateTiStore("", xxx)
snap := storage.GetSnapShot(checkpoint)
iterator := snap.Iter(keyRange.Begin, keyRange.End)

两者的功能看起来是差不多的,我的疑问是,他们的内部实现是否有所区别,性能上是否有影响。

另外,这两者的Iterator接口定义并不一致,在txnClient定义中,Iterator定义为

type Iterator interface {
	Valid() bool
	Key() []byte
	Value() []byte
	Next() error
	Close()
}

而tidbkv.Iterator定义为

type Iterator interface {
	Valid() bool
	Key() Key
	Value() []byte
	Next() error
	Close()
}

其中后者的Key的定义为type Key []byte由于没有加=,所以在外部使用上,两个Iterator并不能互相转化。请教一下如果两者没有区别的话,是否应该将两者定义为同样的类型,或者说,将Key的类型定义为type Key = []byte即可

我的理解,tidb里面这个接口定义的意思是:满足这个接口的kv,都能为我所用。
tikv的这个接口是我提供了这个接口。

在kv是tikv的时候,具体自己调试下,看看是不是一样的。你这个代码看起来不像是tikv提供的storage吧。

现状就是tikv client的接口和tidb的接口不能兼容啊。

看起来不像具体自己试一下

想了想,我应该是说错了,tidb和tikv之间通讯是走的grpc,不是接口直接调用,所以接口类型不能直接变量转换也是正常吧。

嗯嗯,多谢解答

该主题在最后一个回复创建后60天后自动关闭。不再允许新的回复。