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/