如题,请问下如何在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的
嗯,应该是这个,再问下,事务接口和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.
不可以,直接一个黑体警告。
好吧。。。。我们主要用的还是RawKv
不过这个文档很久没有更新了,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模式访问都可以共存。
当然这个配置我属实没有尝试过。
等等看是否有其他大佬来说明。
那就先不混合用吧,其实就像我开始问的,如果只能选择RawKv的话,其实Rawkv的Btachput是原子性的,同时BatchPut里面的key-value都可以带有ttl,如果能够把想删除的key的ttl设置成-1(过期),其实也能达到用事务batch的效果;比如
batchPut{
“key1” : “value1”, ttl = 0;
“key2” : “” ttl = -1;
}
类似这样的,但是发现ttl是uint64的
https://docs.pingcap.com/zh/tidb/stable/tikv-configuration-file#enable-ttl
还不止如此,关键是tikv的ttl是默认关闭的。开启强制要求api-version=2.
还有一大段大红色的警告内容。
感觉不升级是比较难办的。
只能应用测想想办法。
只能升级了