Redis-rs هي مكتبة redis عالية المستوى لـ Rust. فهو يوفر وصولاً سهلاً إلى جميع وظائف Redis من خلال واجهة برمجة التطبيقات (API) المرنة للغاية ولكن ذات المستوى المنخفض. يستخدم سمة تحويل النوع القابلة للتخصيص بحيث يمكن لأي عملية إرجاع النتائج بالنوع الذي تتوقعه فقط. وهذا يجعل تجربة التطوير ممتعة للغاية.
الصندوق يسمى 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" )
}
يتم تحويل المتغيرات من وإلى تنسيق Redis لمجموعة واسعة من الأنواع ( String
, num Types, Tuples, 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) بدلاً من شهادات الجذر الأصلية فمن المفترض أن تكون قادرًا على الاتصال بمثيل redis باستخدام نظام rediss://
URL:
let client = redis :: Client :: open ( "rediss://127.0.0.1/" ) ? ;
لتمكين الوضع غير الآمن، قم بإلحاق #insecure
في نهاية عنوان URL:
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 من خلال تمكين ميزة cluster
في Cargo.toml الخاص بك:
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 ;
}
يمكن تمكين دعم مجموعة 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 عن طريق تحديد "json" كميزة في Cargo.toml الخاص بك.
redis = { version = "0.27.5", features = ["json"] }
ثم يمكنك ببساطة استيراد سمة JsonCommands
التي ستضيف أوامر json
إلى جميع اتصالات Redis (يجب عدم الخلط بينه وبين 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
تلقائيًا، فيمكنك استخدام غلاف Json
من صندوق redis-macros.
لاختبار redis
ستحتاج إلى أن تكون قادرًا على الاختبار باستخدام وحدات Redis، وللقيام بذلك، يجب عليك تعيين متغير البيئة التالي قبل تشغيل البرنامج النصي للاختبار
REDIS_RS_REDIS_JSON_PATH
= المسار المطلق لوحدة RedisJSON (إما librejson.so
لنظام التشغيل Linux أو librejson.dylib
لنظام التشغيل MacOS).
يرجى الرجوع إلى هذا الرابط للوصول إلى وحدة RedisJSON:
إذا كنت ترغب في التطوير في المكتبة، فهناك بعض الأوامر التي يوفرها ملف makefile:
لبناء:
$ make
للاختبار:
$ make test
لتشغيل المعايير:
$ make bench
لإنشاء المستندات (تتطلب مترجمًا ليليًا، راجعrust-lang/rust#43781):
$ make docs
نحن نشجعك على تشغيل clippy
قبل السعي لدمج عملك. يمكن أن تكون الوبر صارمة للغاية. يمكن أن يؤدي تشغيل هذا على محطة العمل الخاصة بك إلى توفير الوقت، نظرًا لأن Travis CI سيفشل في أي بناء لا يرضي clippy
:
$ cargo clippy --all-features --all --tests --examples -- -D clippy::all -D warnings
لإجراء اختبارات Fuzz مع afl، قم أولاً بتثبيت Cargo-afl ( cargo install -f afl
)، ثم قم بتشغيل:
$ make fuzz
إذا وجد Fuzzer عطلًا، فمن أجل إعادة إنتاجه، قم بتشغيل:
$ cd afl//
$ cargo run --bin reproduce -- out/crashes/