عميل Redis بلغة Rust: دليل شامل للعمل مع مكتبة redis-rs

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مكتبة redis-rs: عميل Rust لـ Redis

\n\n

redis-rs هي المكتبة الرئيسية والناضجة والأكثر شيوعًا للعمل مع Redis من لغة Rust. توفر واجهة برمجة تطبيقات (API) متزامنة (Synchronous) وغير متزامنة (Asynchronous) (تعتمد على tokio أو async-std)، وتدعم العنقودية (Clustering)، وخطوط الأنابيب (Pipelines)، والنشر/الاشتراك (Pub/Sub)، والمعاملات (Transactions)، ونصوص Lua البرمجية. تتميز المكتبة بأداء عالٍ، وأمان في التعامل مع الأنواع (Type Safety)، وسهولة الاستخدام، وهي صفات متأصلة في نظام Rust البيئي.

\n\n

التثبيت والاتصال

\n\n

أضف التبعية إلى ملف Cargo.toml:

\n\n
[dependencies]\nredis = { version = "0.25", features = ["tokio-comp"] }  # للبرمجة غير المتزامنة مع tokio\n# أو\nredis = "0.25"  # الوضع المتزامن فقط
\n\n

الاتصال الأساسي بـ Redis (النسخة المتزامنة):

\n\n
use redis::Commands;\n\nfn main() -> redis::RedisResult<()> {\n    let client = redis::Client::open("redis://127.0.0.1:6379/")?;\n    let mut con = client.get_connection()?;\n\n    // تعيين قيمة والحصول عليها\n    con.set("key", "value")?;\n    let val: String = con.get("key")?;\n    println!("تم الحصول على: {}", val);\n\n    Ok(())\n}
\n\n

الإمكانيات الرئيسية

\n\n

1. الأوامر المقيدة بالأنواع (Typed Commands)

\n

تقوم المكتبة تلقائيًا بتحويل أنواع Rust إلى أنواع Redis والعكس. تدعم السلاسل النصية، الأرقام، الصفوف (Tuples)، المتجهات (Vectors)، بالإضافة إلى الأنواع المخصصة من خلال الخاصية (Trait) FromRedisValue / ToRedisArgs.

\n\n
use redis::Commands;\n\nlet mut con = client.get_connection()?;\nlet count: i32 = con.incr("counter", 2)?;  // زيادة ذرية\nlet exists: bool = con.exists("nonexistent")?;\nlet members: Vec<String> = con.smembers("set_key")?;
\n\n

2. خطوط الأنابيب (Pipelines)

\n

تسمح خطوط الأنابيب بإرسال أوامر متعددة في طلب شبكة واحد، مما يسرع بشكل كبير العمليات المجمعة.

\n\n
use redis::Pipeline;\n\nlet mut pipe = Pipeline::new();\npipe.cmd("SET").arg("a").arg(1).ignore();\npipe.cmd("SET").arg("b").arg(2).ignore();\npipe.cmd("GET").arg("a");\nlet result: i32 = pipe.query(&mut con)?;\nprintln!("قيمة a: {}", result);
\n\n

3. الوضع غير المتزامن (async/await)

\n

للتطبيقات ذات الأحمال العالية، استخدم واجهة برمجة التطبيقات غير المتزامنة المعتمدة على tokio أو async-std.

\n\n
use redis::AsyncCommands;\n\n#[tokio::main]\nasync fn main() -> redis::RedisResult<()> {\n    let client = redis::Client::open("redis://127.0.0.1:6379/")?;\n    let mut con = client.get_multiplexed_async_connection().await?;\n\n    con.set("async_key", "async_value").await?;\n    let val: String = con.get("async_key").await?;\n    println!("غير متزامن: {}", val);\n\n    Ok(())\n}
\n\n

4. النشر/الاشتراك (Pub/Sub)

\n

تنفيذ نمط الناشر-المشترك لتبادل الرسائل في الوقت الفعلي.

\n\n
use redis::{AsyncCommands, RedisResult};\n\n#[tokio::main]\nasync fn main() -> RedisResult<()> {\n    let client = redis::Client::open("redis://127.0.0.1:6379/")?;\n\n    // المشترك\n    let mut pubsub = client.get_async_connection().await?.into_pubsub();\n    pubsub.subscribe("news").await?;\n\n    loop {\n        let msg = pubsub.next_message().await?;\n        println!("تم الاستلام: {:?}", msg.get_payload::<String>()?);\n    }\n}
\n\n

5. المعاملات (MULTI/EXEC)

\n

تجميع الأوامر في معاملة ذرية.

\n\n
use redis::Commands;\n\nlet mut con = client.get_connection()?;\nredis::transaction(&mut con, &["key1", "key2"], |con, pipe| {\n    pipe.cmd("SET").arg("key1").arg(42).ignore();\n    pipe.cmd("INCR").arg("key2");\n    pipe.query(con)\n})?;
\n\n

6. العنقودية (Clustering)

\n

للعمل مع Redis Cluster، استخدم redis::cluster::ClusterClient:

\

توصيات