开发问题
最近在应用开发时同时使用了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
即可