التخزين المؤقت في Rust: Redis وMemcached والحلول المدمجة

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

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

ابدأ الدورة

التخزين المؤقت في 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

توصيات