التخزين المؤقت في Rust: Redis وMemcached والحلول المدمجة
التخزين المؤقت هو أحد الآليات الرئيسية لتحسين أداء تطبيقات الويب والأنظمة عالية التحميل. في نظام Rust البيئي، تتوفر عدة مكتبات قوية لتنظيم التخزين المؤقت: من الحلول الموزعة (Redis، Memcached) إلى التخزين المؤقت الخفيف في الذاكرة (moka، cached). في هذه المقالة، سنشرح كل منها بالتفصيل، ونقدم أمثلة كود، ونقارن أداءها.
1. Redis عبر الكريت redis-rs
redis-rs هو العميل الرئيسي والأكثر نضجًا لـ Redis في Rust. يدعم جميع الإمكانيات الأساسية: السلاسل، القوائم، التجزئة، pub/sub، المعاملات والتجميع.
التثبيت
[dependencies]redis = { version = "0.25", features = ["tokio-comp"] }tokio = { version = "1", features = ["full"] }مثال: تخزين مؤقت أساسي مع Redis
use redis::{AsyncCommands, Client};use std::time::Duration;
#[tokio::main]async fn main() -> redis::RedisResult<()> { let client = Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_multiplexed_async_connection().await?;
// تعيين مفتاح مع TTL لمدة 60 ثانية con.set_ex("user:1:profile", "{\\"name\\":\\"Alice\\"}", 60).await?;
// قراءة القيمة let data: Option<String> = con.get("user:1:profile").await?; println!("تم الاستلام: {:?}", data);
// زيادة العداد let count: i64 = con.incr("page_views", 1).await?; println!("مشاهدات الصفحة: {}", count);
Ok(())}الميزات الهامة:
- اللاتزامنية: يدعم redis-rs كلاً من الوضع المتزامن وغير المتزامن (tokio/async-std).
- Pipeline: تجميع الأوامر لتقليل زمن الاستجابة.
- التجميع: دعم Redis Cluster عبر
redis::cluster.
2. Memcached عبر الكريت memcached-rs
Memcached هو مخزن موزع خفيف الوزن من نوع مفتاح-قيمة. بالنسبة لـ Rust، يوجد الكريت memcached-rs (أو memcache).
مثال استخدام
use memcache::Client;
fn main() -> memcache::MemcacheResult<()> { let client = Client::connect("memcache://127.0.0.1:11211")?;
// كتابة مع TTL client.set("session:token_abc", "user_data", 30)?;
// قراءة let value: Option<String> = client.get("session:token_abc")?; println!("من Memcached: {:?}", value);
// حذف client.delete("session:token_abc")?;
Ok(())}متى تختار Memcached بدلاً من Redis:
- إذا كنت تحتاج فقط إلى تخزين مؤقت بسيط (مفتاح-قيمة).
- إذا كان زمن الاستجابة الأدنى مهمًا (Memcached أسرع من Redis للعمليات البسيطة).
- إذا لم تكن بحاجة إلى هياكل بيانات Redis (القوائم، التجزئة، المجموعات).
3. التخزين المؤقت المدمج في الذاكرة: moka و cached
للتخزين المؤقت داخل عملية واحدة (بدون خادم خارجي)، تعتبر الكريتات moka و cached ممتازة.
3.1 Moka — تخزين مؤقت عالي الأداء
moka هو تخزين مؤقت غير متزامن وآمن للخيوط مع دعم TTL، الحد الأقصى للحجم وسياسة الإزالة (LRU، LFU).
use moka::future::Cache;use std::time::Duration;
#[tokio::main]async fn main() { let cache: Cache<String, String> = Cache::builder() .max_capacity(10_000) // الحد الأقصى 10,000 سجل .time_to_live(Duration::from_secs(300)) // TTL 5 دقائق .build();
// إدراج cache.insert("key1".to_string(), "value1".to_string()).await;
// استرجاع if let Some(value) = cache.get(&"key1".to_string()).await { p