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