请问tikv中如何实现一个batch中既有put操作,又有delete操作

如题,请问下如何在tikv中实现一个bantch操作中既有put操作又有delete操作;
目前能想到的就是用batchPut加上ttl的操作,但是如何设置删除的key的过期时间呢

我不清楚你用的client是不是go的。

https://github.com/tikv/client-go/issues/408

这个issue里面明确提到,有一个接口是BatchPutTTL。

还是有一个问题就是,ttl只支持rawkv。带事务的就没有办法支持。

楼上说的对

在 TiKV 中,可以使用 RawKV 接口来执行 Put 和 Delete 操作。以下是一个简单的示例,展示了如何在一个 Batch 操作中执行 Put 和 Delete 操作:

package main

import (
	"context"
	"fmt"
	"github.com/tikv/client-go/config"
	"github.com/tikv/client-go/rawkv"
)

func main() {
	// 创建 RawKV 客户端
	cli, err := rawkv.NewClient(context.Background(), []string{"127.0.0.1:2379"}, config.Security{})
	if err != nil {
		fmt.Printf("Failed to create TiKV client: %v\n", err)
		return
	}
	defer cli.Close()

	batch := cli.NewWriteBatch()

	// 添加 Put 操作
	batch.Put([]byte("key1"), []byte("value1"))

	// 添加 Delete 操作
	batch.Delete([]byte("key2"))

	// 提交 Batch 操作
	err = batch.Write()
	if err != nil {
		fmt.Printf("Failed to write batch: %v\n", err)
		return
	}

	fmt.Println("Batch operation completed successfully")
}

我是用的C++的客户端

多谢,我看下go的实现

你回答的是对所有的key做batch的ttl,我想说的是如何给一个key设置一个过期的ttl,相当于delete的效果

这两个操作的batch是原子的对吧

不是非常明白。
意思是说你要batchput,但其batchput的这一批里面的一个或几个key是你不想要的?
甚至这个不想要的key并不在你batchput的这一批里面?
因为没有使用事务型的kv访问,所以你必须要在一个调用里面完成batchput+删除,是这么个意思?

我的意思是一个WriteBatch里面既有put的操作又有delete操作,类似rocksdb中这个操作:

// 创建一个WriteBatch
rocksdb::WriteBatch batch;

batch.Put(“key1”, “value1”);
batch.Delete(“key2”);
status = db->Write(rocksdb::WriteOptions(), &batch);
但是所有的key都是在一个region的

1 个赞

这里的batch感觉就类似一个事务。

https://github.com/tikv/client-go/wiki/TxnKV-Basic#writes

感觉符合你要求是上面这种。

嗯,应该是这个,再问下,事务接口和RawKv接口可以同时混合调用吗,也就是一个项目中具有RawClient又有事务Client,这样会有影响吗?

https://github.com/tikv/client-go/wiki/RawKV-Basic#basic-rawkv-api

Note: Currently a TiKV cluster can only choose one of the rawkv or txnkv APIs to use. Mixing them will cause unavailability issues due to inconsistent key encoding.

不可以,直接一个黑体警告。

1 个赞

好吧。。。。我们主要用的还是RawKv :cry:

不过这个文档很久没有更新了,tikv的配置里面的说法又不同。

https://docs.pingcap.com/zh/tidb/stable/tikv-configuration-file#api-version-从-v610-版本开始引入

* 数据根据使用方式划分范围,支持单一集群 TiDB、事务 KV、RawKV 应用共存。

我理解这里配置api-version=2,就可以做到无论是tidb使用tikv做存储,还是client通过txn或者raw模式访问都可以共存。
当然这个配置我属实没有尝试过。
等等看是否有其他大佬来说明。

1 个赞

那就先不混合用吧,其实就像我开始问的,如果只能选择RawKv的话,其实Rawkv的Btachput是原子性的,同时BatchPut里面的key-value都可以带有ttl,如果能够把想删除的key的ttl设置成-1(过期),其实也能达到用事务batch的效果;比如
batchPut{
“key1” : “value1”, ttl = 0;
“key2” : “” ttl = -1;
}
类似这样的,但是发现ttl是uint64的 :joy:

https://docs.pingcap.com/zh/tidb/stable/tikv-configuration-file#enable-ttl

还不止如此,关键是tikv的ttl是默认关闭的。开启强制要求api-version=2.
还有一大段大红色的警告内容。:joy:
感觉不升级是比较难办的。
只能应用测想想办法。

1 个赞

只能升级了 :smiling_face_with_tear: