1 个不稳定版本
0.23.0 | 2024年1月16日 |
---|
#1847 在 数据库接口
490KB
10K SLoC
redis-rs
redis-rs 是一个用于 Rust 的高层 Redis 库。它通过一个非常灵活但底层的 API 提供了对所有 Redis 功能的便捷访问。它使用可定制的类型转换特质,使得任何操作都可以返回您期望的类型的结果。这使得开发体验非常愉快。
该 crate 称为 redis
,您可以通过 cargo 依赖它
[dependencies]
redis = "0.23.0"
有关库的文档可以在 docs.rs/redis 找到。
注意:redis-rs 需要 Rust 1.59 或更高版本。
基本操作
要打开一个连接,您需要创建一个客户端,然后从其中获取一个连接。将来将会有一个连接池,但目前每个连接都是独立的,没有池化。
许多命令通过 Commands
特质实现,但也可以手动创建命令。
extern crate redis;
use redis::Commands;
fn fetch_an_integer() -> redis::RedisResult<isize> {
// connect to redis
let client = redis::Client::open("redis://127.0.0.1/")?;
let mut con = client.get_connection()?;
// throw away the result, just make sure it does not fail
let _ : () = con.set("my_key", 42)?;
// read back the key and return it. Because the return value
// from the function is a result for integer this will automatically
// convert into one.
con.get("my_key")
}
异步支持
要启用异步客户端,您需要在 Cargo.toml 中启用相关功能,对于 tokio 用户是 tokio-comp
,对于 async-std 用户是 async-std-comp
。
# if you use tokio
redis = { version = "0.23.0", features = ["tokio-comp"] }
# if you use async-std
redis = { version = "0.23.0", features = ["async-std-comp"] }
TLS 支持
要启用 TLS 支持,您需要在 Cargo.toml 中使用相关功能条目。目前支持 native-tls
和 rustls
。
使用 native-tls
redis = { version = "0.23.0", features = ["tls-native-tls"] }
# if you use tokio
redis = { version = "0.23.0", features = ["tokio-native-tls-comp"] }
# if you use async-std
redis = { version = "0.23.0", features = ["async-std-native-tls-comp"] }
使用 rustls
redis = { version = "0.23.0", features = ["tls-rustls"] }
# if you use tokio
redis = { version = "0.23.0", features = ["tokio-rustls-comp"] }
# if you use async-std
redis = { version = "0.23.0", features = ["async-std-rustls-comp"] }
使用 rustls
,您可以在其他功能标志之上添加以下功能标志以启用附加功能
tls-rustls-insecure
:允许不安全的 TLS 连接tls-rustls-webpki-roots
:使用webpki-roots
(Mozilla 的根证书)而不是本地根证书
然后您应该能够使用 rediss:
URL 方案连接到 Redis 实例
let client = redis::Client::open("rediss://127.0.0.1/")?;
弃用通知:如果您使用的是 tls
或 async-std-tls-comp
功能,请分别使用 tls-native-tls
或 async-std-native-tls-comp
功能。
集群支持
可以通过在 Cargo.toml 中启用 cluster
功能来启用对 Redis 集群的支持
redis= {版本= "0.23.0",功能= [ "cluster"] }
然后您可以直接使用ClusterClient
,它接受可用节点的列表。请注意,在实例化客户端时,尽管可以指定多个,但集群中只需要指定一个节点。
use redis::cluster::ClusterClient;
use redis::Commands;
fn fetch_an_integer() -> String {
let nodes = vec!["redis://127.0.0.1/"];
let client = ClusterClient::new(nodes).unwrap();
let mut connection = client.get_connection().unwrap();
let _: () = connection.set("test", "test_data").unwrap();
let rv: String = connection.get("test").unwrap();
return rv;
}
通过启用cluster-async
功能,并配合您首选的异步运行时,可以启用异步Redis集群支持,例如:
redis= {版本= "0.23.0",功能= [ "cluster-async", "tokio-std-comp" ] }
use redis::cluster::ClusterClient;
use redis::AsyncCommands;
async fn fetch_an_integer() -> String {
let nodes = vec!["redis://127.0.0.1/"];
let client = ClusterClient::new(nodes).unwrap();
let mut connection = client.get_async_connection().await.unwrap();
let _: () = connection.set("test", "test_data").await.unwrap();
let rv: String = connection.get("test").await.unwrap();
return rv;
}
JSON支持
通过在Cargo.toml中将“json”指定为功能,可以启用RedisJSON模块的支持。
redis= {版本= "0.23.0",功能= ["json"] }
然后您可以简单地导入JsonCommands
特质,这将向所有Redis连接添加json
命令(与仅添加默认命令的Commands
不要混淆)。
use redis::Client;
use redis::JsonCommands;
use redis::RedisResult;
use redis::ToRedisArgs;
// Result returns Ok(true) if the value was set
// Result returns Err(e) if there was an error with the server itself OR serde_json was unable to serialize the boolean
fn set_json_bool<P: ToRedisArgs>(key: P, path: P, b: bool) -> RedisResult<bool> {
let client = Client::open("redis://127.0.0.1").unwrap();
let connection = client.get_connection().unwrap();
// runs `JSON.SET {key} {path} {b}`
connection.json_set(key, path, b)?
// you'll need to use serde_json (or some other json lib) to deserialize the results from the bytes
// It will always be a Vec, if no results were found at the path it'll be an empty Vec
}
开发
要测试redis
,您将需要能够与Redis模块一起测试,为了做到这一点,您必须在运行测试脚本之前设置以下环境变量:
REDIS_RS_REDIS_JSON_PATH
= RedisJSON模块的绝对路径(通常称为librejson.so
)。
如果您想在该库上进行开发,makefile提供了一些命令:
构建
$ make
测试
$ make test
运行基准测试
$ make bench
构建文档(需要夜间编译器,请参阅rust-lang/rust#43781)
$ make docs
我们鼓励您在提交工作前先运行clippy
。lints可能非常严格。在您的个人工作站上运行此命令可以节省您的时间,因为Travis CI将失败任何不符合clippy
的构建。
$ cargo clippy --all-features --all --tests --examples -- -D clippy::all -D warnings
要使用afl运行模糊测试,首先安装cargo-afl(cargo install -f afl
),然后运行
$ make fuzz
如果模糊器发现崩溃,为了重现它,运行
$ cd afl/<target>/
$ cargo run --bin reproduce -- out/crashes/<crashfile>
依赖项
~2–17MB
~252K SLoC