مكتبة redis-rs: عميل Rust لـ Redis
\n\nredis-rs هي المكتبة الرئيسية والناضجة والأكثر شيوعًا للعمل مع Redis من لغة Rust. توفر واجهة برمجة تطبيقات (API) متزامنة (Synchronous) وغير متزامنة (Asynchronous) (تعتمد على tokio أو async-std)، وتدعم العنقودية (Clustering)، وخطوط الأنابيب (Pipelines)، والنشر/الاشتراك (Pub/Sub)، والمعاملات (Transactions)، ونصوص Lua البرمجية. تتميز المكتبة بأداء عالٍ، وأمان في التعامل مع الأنواع (Type Safety)، وسهولة الاستخدام، وهي صفات متأصلة في نظام Rust البيئي.
التثبيت والاتصال
\n\nأضف التبعية إلى ملف Cargo.toml:
[dependencies]\nredis = { version = "0.25", features = ["tokio-comp"] } # للبرمجة غير المتزامنة مع tokio\n# أو\nredis = "0.25" # الوضع المتزامن فقط\n\nالاتصال الأساسي بـ Redis (النسخة المتزامنة):
\n\nuse 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\n1. الأوامر المقيدة بالأنواع (Typed Commands)
\nتقوم المكتبة تلقائيًا بتحويل أنواع Rust إلى أنواع Redis والعكس. تدعم السلاسل النصية، الأرقام، الصفوف (Tuples)، المتجهات (Vectors)، بالإضافة إلى الأنواع المخصصة من خلال الخاصية (Trait) FromRedisValue / ToRedisArgs.
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\n2. خطوط الأنابيب (Pipelines)
\nتسمح خطوط الأنابيب بإرسال أوامر متعددة في طلب شبكة واحد، مما يسرع بشكل كبير العمليات المجمعة.
\n\nuse 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\n3. الوضع غير المتزامن (async/await)
\nللتطبيقات ذات الأحمال العالية، استخدم واجهة برمجة التطبيقات غير المتزامنة المعتمدة على tokio أو async-std.
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\n4. النشر/الاشتراك (Pub/Sub)
\nتنفيذ نمط الناشر-المشترك لتبادل الرسائل في الوقت الفعلي.
\n\nuse 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\n5. المعاملات (MULTI/EXEC)
\nتجميع الأوامر في معاملة ذرية.
\n\nuse 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\n6. العنقودية (Clustering)
\nللعمل مع Redis Cluster، استخدم redis::cluster::ClusterClient: