Redis-rs は、Rust 用の高レベルの Redis ライブラリです。非常に柔軟だが低レベルの API を通じて、すべての Redis 機能への便利なアクセスを提供します。カスタマイズ可能な型変換特性を使用するため、あらゆる操作で期待どおりの型の結果を返すことができます。これにより、非常に快適な開発エクスペリエンスが得られます。
クレートはredis
と呼ばれ、カーゴ経由でそれに依存できます。
[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" )
}
変数は、さまざまな型 ( String
、 num 型、タプル、 Vec
) の Redis 形式との間で変換されます。独自の型で使用したい場合は、 FromRedisValue
およびToRedisArgs
特性を実装するか、redis-macros クレートを使用して派生できます。
非同期クライアントを有効にするには、Cargo.toml で関連する機能を有効にし、tokio ユーザーの場合はtokio-comp
、async-std ユーザーの場合はasync-std-comp
有効にします。
# 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
機能を使用してください。
Redis クラスターのサポートは、Cargo.toml でcluster
機能を有効にすることで有効にできます。
redis = { version = "0.27.5", features = [ "cluster"] }
その後、利用可能なノードのリストを受け入れるClusterClient
使用するだけです。クライアントをインスタンス化するときに指定する必要があるノードはクラスター内で 1 つだけですが、複数指定することもできることに注意してください。
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 ;
}
非同期 Redis クラスターのサポートはcluster-async
機能と優先非同期ランタイムを有効にすることで有効にできます。例:
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 ;
}
RedisJSON モジュールのサポートは、Cargo.toml で機能として「json」を指定することで有効にできます。
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 lib) を使用して、バイトからの結果を逆シリアル化する必要があります。これは常に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
ドキュメントをビルドするには (nightly コンパイラーが必要、rust-lang/rust#43781 を参照):
$ make docs
作業のマージを求める前に、 clippy
実行することをお勧めします。糸くずは非常に厳しい場合があります。 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/