التخزين المؤقت في Go: Redis وMemcached والحلول المدمجة من الألف إلى الياء

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

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

ابدأ الدورة

مقدمة: لماذا يعتبر التخزين المؤقت أمرًا بالغ الأهمية لتطبيقات Go



في تطوير الويب الحديث، تؤثر سرعة استجابة التطبيق بشكل مباشر على تجربة المستخدم ومعدل التحويل. تشتهر لغة Go (Golang) بأدائها العالي، ولكن حتى أكثر التطبيقات تحسينًا قد تواجه اختناقات عند التعامل مع قواعد البيانات أو واجهات برمجة التطبيقات الخارجية. هنا يأتي دور التخزين المؤقت.



التخزين المؤقت هو تخزين مؤقت للبيانات المطلوبة بشكل متكرر في مخزن سريع. في نظام Go البيئي، هناك ثلاثة أساليب رئيسية:



  • الحلول المدمجة (sync.Map، map + mutex) — لكميات صغيرة من البيانات داخل عملية واحدة.
  • Memcached — تخزين مؤقت موزع في الذاكرة، بسيط وسريع.
  • Redis — مخزن متقدم يدعم هياكل البيانات، الاستمرارية والتجميع.


في هذه المقالة، سنشرح كل خيار مع أمثلة عملية بلغة Go، ونقارن أداءها ونقدم توصيات للاختيار.



التخزين المؤقت المدمج في Go: sync.Map والخرائط المتزامنة



للسيناريوهات البسيطة، عندما لا يحتاج التخزين المؤقت إلى أن يكون موزعًا، توفر Go أدوات قياسية. الخيار الأكثر شيوعًا هو sync.Map، الذي تم تقديمه في Go 1.9.



مثال: sync.Map لتخزين نتائج API مؤقتًا



package main

import ( "fmt" "sync" "time")

type Cache struct { data sync.Map}

func (c *Cache) Get(key string) (interface{}, bool) { return c.data.Load(key)}

func (c *Cache) Set(key string, value interface{}, ttl time.Duration) { c.data.Store(key, value) time.AfterFunc(ttl, func() { c.data.Delete(key) })}

func main() { cache := &Cache{} cache.Set("user_42", "Alice", 5*time.Second)

if val, ok := cache.Get("user_42"); ok { fmt.Println("التخزين المؤقت يحتوي على:", val) }}


المزايا: لا تبعيات، أمان للخيوط، بساطة.

العيوب: لا يوجد إخلاء تلقائي (باستثناء TTL عبر حلول بديلة)، لا توزيع، أداء محدود عند المنافسة العالية.



للسيناريوهات الأكثر تعقيدًا، استخدم مكتبات مثل go-cache أو bigcache، التي توفر TTL، إخلاء LFU/LRU وزمن وصول منخفض.



Memcached في Go: تخزين مؤقت موزع خفيف وسريع



Memcached هو نظام تخزين مؤقت موزع في الذاكرة. إنه مثالي لتخزين أزواج بسيطة من "مفتاح-قيمة" بحجم صغير (حتى 1 ميجابايت).



الاتصال بـ Memcached من Go



للعمل مع Memcached، استخدم المكتبة github.com/bradfitz/gomemcache.



package main

import ( "fmt" "github.com/bradfitz/gomemcache/memcache")

func main() { mc := memcache.New("localhost:11211")

// كتابة في التخزين المؤقت err := mc.Set(&memcache.Item{ Key: "user_100", Value: []byte(`{"name":"Bob","age":30}`), Expiration: 300, // 5 دقائق }) if err != nil { panic(err) }

// قراءة من التخزين المؤقت item, err := mc.Get("user_100") if err == nil { fmt.Printf("البيانات: %s", item.Value) } else { fmt.Println("خطأ في التخزين المؤقت") }}


متى تختار Memcached:

  • تحتاج إلى مخزن بسيط من نوع مفتاح-قيمة.
  • حجم الكائنات لا يتجاوز 1 ميجابايت.
  • لا تحتاج إلى استمرارية أو هياكل بيانات معقدة.
  • سرعة عالية في القراءة/الكتابة (زمن وصول < 1 مللي ثانية).


القيود: لا نسخ متماثل، لا معاملات، فقدان البيانات عند إعادة التشغيل.



Redis في Go: أداة قوية بإمكانيات غنية



Redis ليس مجرد تخزين مؤقت، بل هو مخزن بيانات كامل في الذاكرة يدعم السلاسل، القوائم، المجموعات، التجزئات وحتى قوائم الانتظار. بالنسبة لـ Go، الأفضل هو

المدونات

توصيات الكتب