5个版本 (3个破坏性版本)
0.3.0 | 2023年11月21日 |
---|---|
0.2.0 | 2023年7月11日 |
0.1.0 | 2021年5月12日 |
0.0.99 | 2021年4月29日 |
0.0.0 | 2018年10月11日 |
#217 in 数据库接口
2,657 每月下载
用于 7 crate
1MB
21K SLoC
TiKV客户端(Rust)
此crate提供了一个用于TiKV(>= v5.0.0
)集群的易于使用的客户端,TiKV是一个用Rust编写的分布式、事务型键值数据库。
此crate允许您连接到TiKV集群,并使用事务性或原始(简单get/put样式,不保证事务一致性)API来访问和更新数据。
TiKV Rust客户端是一个开源(Apache 2)项目,由TiKV作者维护。我们欢迎贡献,更多信息请见下文。
请注意,当前版本不适合生产使用 - API尚未稳定,crate在现实生活中的使用尚未经过彻底测试。
入门指南
TiKV客户端是一个Rust库(crate)。要在项目中使用此crate,请将以下依赖项添加到您的 Cargo.toml
[dependencies]
tikv-client = "0.3"
先决条件
rust
>=1.56.1
,需要hashbrown-v0.12.1
使用客户端库的一般流程是创建一个原始客户端对象或事务客户端对象(可以进行配置),然后使用客户端对象发送命令,或者用它来创建事务对象。在后一种情况下,通过各种命令构建事务,然后提交(或回滚)。
示例
原始模式
use tikv_client::RawClient;
let client = RawClient::new(vec!["127.0.0.1:2379"], None).await?;
client.put("key".to_owned(), "value".to_owned()).await?;
let value = client.get("key".to_owned()).await?;
事务模式
use tikv_client::TransactionClient;
let txn_client = TransactionClient::new(vec!["127.0.0.1:2379"], None).await?;
let mut txn = txn_client.begin_optimistic().await?;
txn.put("key".to_owned(), "value".to_owned()).await?;
let value = txn.get("key".to_owned()).await?;
txn.commit().await?;
由于 TiKV 客户端提供异步 API,您需要使用异步运行时(我们目前仅支持 Tokio)。有关完整示例,请参阅 getting-started.md。
API 概述
TiKV Rust 客户端支持几个抽象级别。使用客户端最方便的方法是通过 RawClient
和 TransactionClient
。这提供了一个非常高级的 API,主要抽象了存储的分布式特性,并为所有协议提供了合理的默认值。此接口可以进行配置,主要是在创建客户端或事务对象时通过 Config
和 TransactionOptions
结构体。使用一些选项,您可以自己接管部分协议(例如重试失败的消息)。
最低级别的抽象是直接创建并发送 gRPC 消息到 TiKV(和 PD)节点。tikv-client-store
和 tikv-client-pd
包使得使用 protobuf 定义和 gRPC 库更加容易,但提供了相同级别的控制。
在这些抽象级别之间,您可以向 TiKV 集群发送和接收单个消息,但可以利用库代码执行常见操作,例如将数据解析到区域和集群中的节点,或重试失败的消息。这可以用于测试 TiKV 集群或某些高级用例。请参阅 client_rust::request
模块以了解此 API,以及 client_rust::raw::lowering
和 client_rust::transaction::lowering
以获取创建请求对象的便捷方法。
本文档的其余部分仅描述 RawClient
/TransactionClient
API。
重要提示:不建议或支持在同一个数据库上同时使用原始和事务 API。
类型
Key
:存储中的键。String
和 Vec<u8>
实现 Into<Key>
,因此您可以直接将它们传递给客户端函数。
Value
:存储中的值;只是 Vec<u8>
的别名。
KvPair
:一对 Key
和 Value
。它提供方便的方法用于转换到和从其他类型。
BoundRange
:用于范围相关请求,如 scan
。它实现了 Rust 范围的 From
,因此您可以将 Rust 键的范围传递给请求,例如,client.delete_range(vec![]..)
。
原始请求
请求 | 主要参数类型 | 结果类型 | 值得注意的行为 |
---|---|---|---|
put |
KvPair |
||
get |
Key |
Option<Value> |
|
delete |
Key |
||
删除范围 |
BoundRange |
||
扫描 |
BoundRange |
Vec<KvPair> |
|
批量插入 |
迭代器<KvPair> |
||
批量获取 |
迭代器<Key> |
Vec<KvPair> |
跳过不存在的键;不保留顺序 |
批量删除 |
迭代器<Key> |
||
批量扫描 |
迭代器<BoundRange> |
Vec<KvPair> |
查看文档以了解 each_limit 参数行为。保留范围的顺序。 |
批量扫描键 |
迭代器<BoundRange> |
Vec<Key> |
查看文档以了解 each_limit 参数行为。保留范围的顺序。 |
比较并交换 |
Key + 2x Value |
(Option<Value>, 布尔型) |
事务请求
请求 | 主要参数类型 | 结果类型 | 值得注意的行为 |
---|---|---|---|
put |
KvPair |
||
get |
Key |
Option<值> |
|
获取更新 |
Key |
Option<值> |
|
键存在 |
Key |
布尔型 |
|
delete |
Key |
||
扫描 |
BoundRange |
迭代器<KvPair> |
|
扫描键 |
BoundRange |
迭代器<Key> |
|
批量获取 |
迭代器<Key> |
迭代器<KvPair> |
跳过不存在的键;不保留顺序 |
批量获取更新 |
迭代器<Key> |
迭代器<KvPair> |
跳过不存在的键;不保留顺序 |
锁定键 |
迭代器<Key> |
||
发送心跳 |
u64 (TTL) |
||
垃圾回收 |
时间戳 |
布尔型 |
如果 PD 中的最新安全点等于参数,则返回 true |
开发和贡献
我们欢迎您的贡献!贡献代码是很好的,我们也感谢提交 问题 以识别错误和提供反馈,添加测试或示例,以及改进文档。
构建和测试
我们使用标准的 Cargo 工作流程,例如,使用 cargo build
构建,并使用 cargo test/nextest
运行单元测试。您将需要使用夜间 Rust 工具链来构建和运行测试。可以使用 nextest 来加速 ut,首先安装 nextest。
cargo install cargo-nextest --locked
运行集成测试或手动使用 TiKV 集群测试客户端要复杂一些。最简单的方法是使用 TiUp (>= 1.5) 在您的本地机器上初始化集群
tiup playground nightly --mode tikv-slim
然后如果您想运行集成测试
PD_ADDRS="127.0.0.1:2379" cargo test --package tikv-client --test integration_tests --features integration-tests
创建 PR
我们使用标准的 GitHub PR 工作流程。我们为每个 PR 运行 CI,并要求所有 PR 无警告构建(包括 clippy 和 Rustfmt 警告),通过测试,具有 DCO 签署(在提交时使用 -s
,DCO 机器人将引导您完成首次 PR 的 DCO 协议),并且至少有一个审阅。如果您有任何困难,不要担心,在 PR 上询问。
要本地运行类似 CI 的测试,我们建议在提交 PR 之前运行 cargo clippy
,cargo test/nextest run
,和 cargo fmt
。有关运行集成测试的说明,但您可能不需要为前几次 PR 担心这一点。
请遵循 PingCAP 的 Rust 风格指南。所有代码 PR 应包括新的测试或测试用例。
获取帮助
如果您需要帮助,无论是寻找要工作的事情,还是遇到任何技术问题,最简单的方法是通过 internals.tidb.io,这是 TiDB 开发者的论坛。
您也可以在 Slack 上提问。我们监控 tikv-wg slack 上的 #client-rust 频道。
您可以直接在 GitHub issues 或 PR 上提问;如果您没有收到回复,您应该 ping @ekexium 或 @andylokandy。
依赖关系
~16–33MB
~568K SLoC