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

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

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

ابدأ الدورة

التخزين المؤقت في Rust: Redis وأدوات أخرى لتسريع التطبيقات

التخزين المؤقت هو أحد الآليات الرئيسية لتحسين الأداء. في Rust، مع تركيزها على السرعة والأمان، يمكن أن يؤدي اختيار الأداة المناسبة للتخزين المؤقت إلى تحقيق مكاسب كبيرة. في هذه المقالة، سننظر في المكتبات الشائعة: redis-rs (مع تجمع الاتصالات)، moka (ذاكرة تخزين مؤقت في الذاكرة) و cached (مزخرفات الدوال).



1. Redis: ذاكرة تخزين مؤقت خارجية عبر redis-rs و deadpool

Redis هو أكثر أنواع التخزين المؤقت الخارجي شيوعاً. للعمل معه في Rust، يتم استخدام الكريت redis-rs. للأحمال الإنتاجية، يُنصح بتوصيل تجمع اتصالات عبر deadpool-redis.



التثبيت

[dependencies]redis = { version = "0.25", features = ["tokio-comp"] }deadpool-redis = "0.14"tokio = { version = "1", features = ["full"] }serde = { version = "1", features = ["derive"] }serde_json = "1"


مثال: العمل الأساسي مع Redis

use redis::AsyncCommands;use deadpool_redis::{Config, Runtime};

#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { // إنشاء تجمع اتصالات let cfg = Config::from_url("redis://127.0.0.1:6379"); let pool = cfg.create_pool(Some(Runtime::Tokio1))?;

// الحصول على اتصال من التجمع let mut conn = pool.get().await?;

// تعيين قيمة مع TTL لمدة 60 ثانية conn.set_ex("user:42", "{\\"name\\":\\"Alice\\",\\"role\\":\\"admin\\"}", 60).await?;

// القراءة let value: String = conn.get("user:42").await?; println!("تم الحصول على: {}", value);

// الحذف conn.del("user:42").await?;

Ok(())}


تسلسل الهياكل

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]struct User { id: u64, name: String, email: String,}

async fn cache_user(conn: &mut redis::aio::Connection, user: &User) -> redis::RedisResult<()> { let key = format!("user:{}", user.id); let json = serde_json::to_string(user).unwrap(); conn.set_ex(key, json, 300).await}

async fn get_cached_user(conn: &mut redis::aio::Connection, id: u64) -> Option<User> { let key = format!("user:{}", id); let result: Option<String> = conn.get(key).await.ok()?; result.and_then(|json| serde_json::from_str(&json).ok())}


2. Moka: ذاكرة تخزين مؤقت سريعة في الذاكرة

Moka هي ذاكرة تخزين مؤقت عالية الأداء في الذاكرة، مستوحاة من Caffeine (Java). تدعم TTL، والحد من الحجم، والتحديث غير المتزامن.



التثبيت

[dependencies]moka = { version = "0.12", features = ["future"] }tokio = { version = "1", features = ["full"] }


مثال: ذاكرة تخزين مؤقت بحد أقصى 1000 عنصر و TTL لمدة 10 دقائق

use moka::future::Cache;use std::time::Duration;

#[tokio::main]async fn main() { let cache: Cache<String, String> = Cache::builder() .max_capacity(1000) .time_to_live(Duration::from_secs(600)) .build();

// الإدراج cache.insert("key1".to_string(), "value1".to_string()).await;

// القراءة if let Some(v) = cache.get(&"key1".to_string()).await { println!("تم العثور على: {}", v); }

// الحذف cache.invalidate(&"key1".to_string()).await;}


التحديث التلقائي عند انتهاء TTL

let cache: Cache<String, String> = Cache::builder()    .time_to_live(Duration::from_secs(60))    .time_to_idle(Duration::from_secs(30)) // إعادة تعيين TTL عند القراءة    .build();


3. Cached: مزخرفات للدوال

الكريت cached يسمح بتخزين نتائج الدوال مؤقتاً باستخدام السمات. يدعم خلفيات مختلفة، بما في ذلك Redis والذاكرة.



التثبيت

[dependencies]cach                    

توصيات