Redis-rs 是 Rust 的高级 Redis 库。它通过非常灵活但低级的 API 提供对所有 Redis 功能的便捷访问。它使用可自定义的类型转换特征,以便任何操作都可以返回您期望的类型的结果。这带来了非常愉快的开发体验。
该板条箱称为redis
,您可以通过 Cargo 依赖它:
[dependencies]
redis = " 0.27.5 "
有关该库的文档可以在 docs.rs/redis 中找到。
要打开连接,您需要创建一个客户端,然后从中获取连接。将来将会有一个连接池,目前每个连接都是独立的并且不被池化。
许多命令是通过Commands
特征实现的,但也可以手动创建命令。
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" )
}
变量可以与各种类型的 Redis 格式相互转换( String
、 num 类型、元组、 Vec
)。如果您想将它与您自己的类型一起使用,您可以实现FromRedisValue
和ToRedisArgs
特征,或者使用 redis-macros 箱派生它。
要启用异步客户端,请在 Cargo.toml、 tokio-comp
(针对 tokio 用户)或async-std-comp
(针对 async-std 用户)中启用相关功能。
# if you use tokio
redis = { version = "0.27.5", features = ["tokio-comp"] }
# if you use async-std
redis = { version = "0.27.5", features = ["async-std-comp"] }
要启用 TLS 支持,您需要使用 Cargo.toml 中的相关功能条目。目前支持native-tls
和rustls
。
要使用native-tls
:
redis = { version = "0.27.5", features = ["tls-native-tls"] }
# if you use tokio
redis = { version = "0.27.5", features = ["tokio-native-tls-comp"] }
# if you use async-std
redis = { version = "0.27.5", features = ["async-std-native-tls-comp"] }
使用rustls
:
redis = { version = "0.27.5", features = ["tls-rustls"] }
# if you use tokio
redis = { version = "0.27.5", features = ["tokio-rustls-comp"] }
# if you use async-std
redis = { version = "0.27.5", 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/" ) ? ;
要启用不安全模式,请在 URL 末尾附加#insecure
:
let client = redis :: Client :: open ( "rediss://127.0.0.1/#insecure" ) ? ;
弃用通知:如果您使用的是tls
或async-std-tls-comp
功能,请分别使用tls-native-tls
或async-std-native-tls-comp
功能。
可以通过在 Cargo.toml 中启用cluster
功能来启用对 Redis 集群的支持:
redis = { version = "0.27.5", features = [ "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 = { version = "0.27.5", features = [ "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 ;
}
可以通过在 Cargo.toml 中指定“json”作为功能来启用对 RedisJSON 模块的支持。
redis = { version = "0.27.5", features = ["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 ) ?
}
要解析结果,您需要使用serde_json
(或其他一些 json 库)来反序列化字节结果。它始终是一个Vec
,如果在路径中没有找到结果,它将是一个空的Vec
。如果您想自动处理反序列化和Vec
解包,可以使用 redis-macros 箱中的Json
包装器。
要测试redis
您需要能够使用 Redis 模块进行测试,为此,您必须在运行测试脚本之前设置以下环境变量
REDIS_RS_REDIS_JSON_PATH
= RedisJSON 模块的绝对路径(对于 Linux 为librejson.so
,对于 MacOS 为librejson.dylib
)。
请参考此链接访问RedisJSON模块:
如果您想在库上进行开发,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//
$ cargo run --bin reproduce -- out/crashes/