عميل Redis لـ Rust: مكتبة redis-rs
مكتبة redis-rs هي العميل الرئيسي والأكثر شيوعًا للعمل مع Redis في نظام Rust البيئي. توفر مجموعة كاملة من الوظائف للتفاعل مع Redis: من الأوامر البسيطة GET/SET إلى المعاملات المعقدة وخطوط الأنابيب ونشر/اشتراك. بفضل دعمها للأوضاع المتزامنة وغير المتزامنة (async/await)، فإن redis-rs مناسبة لأي مشروع - من البرامج النصية إلى خوادم الويب عالية التحميل.
المكتبة مكتوبة بلغة Rust النقية، وتستخدم إدارة آمنة للذاكرة وأمان الأنواع، مما يقلل من أخطاء وقت التشغيل. يتم دعم جميع أنواع بيانات Redis الشائعة: السلاسل والقوائم والمجموعات والتجزئات والمجموعات المرتبة والخرائط البتية وHyperLogLog والتيارات.
التثبيت والإعداد
أضف التبعية إلى ملف Cargo.toml:
[dependencies]redis = { version = "0.27", features = ["tokio-comp"] }للاستخدام المتزامن، يكفي redis = "0.27". للاستخدام غير المتزامن، اختر أحد المنفذين: tokio-comp (الافتراضي) أو async-std-comp.
الاستخدام الأساسي (الوضع المتزامن)
مثال على الاتصال بـ Redis المحلي وتنفيذ الأوامر البسيطة:
use redis::Commands;
fn main() -> redis::RedisResult<()> { let client = redis::Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_connection()?;
con.set("my_key", "hello world")?; let value: String = con.get("my_key")?; println!("القيمة المستلمة: {}", value);
// العمل مع التجزئات con.hset("user:1", "name", "Alice")?; con.hset("user:1", "age", "30")?; let name: String = con.hget("user:1", "name")?; println!("اسم المستخدم: {}", name);
Ok(())}لاحظ إلغاء التسلسل التلقائي: يمكنك تحديد النوع الذي تريد تحويل النتيجة إليه (String، i32، Vec<String>، إلخ)، وتقوم المكتبة بكل شيء بنفسها.
الوضع غير المتزامن مع Tokio
للتطبيقات عالية الأداء، استخدم واجهة برمجة التطبيقات غير المتزامنة:
use redis::AsyncCommands;use tokio;
#[tokio::main]async fn main() -> redis::RedisResult<()> { let client = redis::Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_multiplexed_async_connection().await?;
// تعيين مع TTL (وقت حياة المفتاح) con.set_ex("temp_key", "قيمة مؤقتة", 60).await?; let val: Option<String> = con.get("temp_key").await?; println!("القيمة: {:?}", val);
// العمل مع القوائم con.lpush("queue", "task1").await?; con.lpush("queue", "task2").await?; let tasks: Vec<String> = con.lrange("queue", 0, -1).await?; println!("المهام في قائمة الانتظار: {:?}", tasks);
Ok(())}يستخدم العميل غير المتزامن اتصالات متعددة الإرسال (مقبس TCP واحد لطلبات متعددة)، مما يحسن الأداء بشكل كبير.
الإمكانيات المتقدمة
خطوط الأنابيب (المعالجة الأنبوبية)
تسمح بإرسال أوامر متعددة في استدعاء شبكة واحد، مما يسرع العمليات الدفعية:
use redis::pipe;
fn main() -> redis::RedisResult<()> { let client = redis::Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_connection()?;
let (val1, val2): (i32, i32) = redis::pipe() .cmd("INCR").arg("counter_a").ignore() .cmd("INCR").arg("counter_b").ignore() .cmd("GET").arg("counter_a").query(&mut con)? .cmd("GET").arg("counter_b").query(&mut con)?;
println!("العدادات: {}, {}", val1, val2); Ok(())}نشر/اشتراك (Pub/Sub)
مثال على الاشتراك في القنوات:
use redis::pubsub::PubSubCommands;
fn main() -> redis::RedisResult<()> {