عميل Redis للغة Go (Golang) — go-redis و radix

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

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

ابدأ الدورة

عميل Redis للغة Go (Golang): go-redis و radix



Redis هي واحدة من أشهر قواعد البيانات في الذاكرة (in-memory)، وتُستخدم للتخزين المؤقت، قوائم الانتظار، الجلسات والتحليلات في الوقت الفعلي. في نظام Go البيئي (Golang)، توجد عدة عملاء ناضجين للعمل مع Redis. في هذه المقالة، سنشرح بالتفصيل المكتبتين الرئيسيتين: go-redis (العميل الأكثر شيوعًا) و radix (الأكثر أداءً والأقل مستوى). ستتعلم كيفية تثبيتهما، الاتصال، تنفيذ العمليات الأساسية، استخدام خطوط الأنابيب، Pub/Sub والعمل مع الكتلة.



1. لماذا Redis مهم لمطور Go

غالبًا ما يتم اختيار Go لبناء تطبيقات الخادم عالية التحميل، الخدمات المصغرة ومعالجات الأحداث. يكمل Redis Go بشكل ممتاز بفضل:

  • السرعة — يتم تنفيذ العمليات في ميكروثانية.
  • البساطة — واجهة برمجة تطبيقات بسيطة، هياكل بيانات مدمجة (سلاسل، قوائم، مجموعات، تجزئات).
  • دعم Pub/Sub، المعاملات ونصوص Lua.

الاختيار الصحيح للعميل يحدد الأداء وسهولة التطوير.



2. go-redis — المعيار الفعلي

go-redis (المستودع github.com/redis/go-redis/v9) هو أشهر عميل Redis للغة Go. يوفر واجهة برمجة تطبيقات عالية المستوى، دعمًا للكتل، الحراس، خطوط الأنابيب، Pub/Sub والأقفال الموزعة.



2.1 التثبيت

go get github.com/redis/go-redis/v9


2.2 الاتصال بـ Redis

package main

import ( "context" "fmt" "github.com/redis/go-redis/v9")

func main() { ctx := context.Background()

rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // بدون كلمة مرور DB: 0, // قاعدة البيانات الافتراضية })

// التحقق من الاتصال pong, err := rdb.Ping(ctx).Result() if err != nil { panic(err) } fmt.Println(pong) // PONG}


2.3 العمليات الأساسية

// تعيين سلسلةerr := rdb.Set(ctx, "key", "value", 0).Err()if err != nil {    panic(err)}

// الحصول على سلسلةval, err := rdb.Get(ctx, "key").Result()if err != nil { panic(err)}fmt.Println("key:", val)

// العمل مع التجزئاتrdb.HSet(ctx, "user:1", "name", "Alice", "age", 30)name, _ := rdb.HGet(ctx, "user:1", "name").Result()fmt.Println("الاسم:", name)

// حذف مفتاحrdb.Del(ctx, "key")


2.4 خطوط الأنابيب (Pipelines)

تسمح خطوط الأنابيب بإرسال أوامر متعددة في استدعاء شبكة واحد، مما يسرع العمليات المجمعة بشكل كبير.

pipe := rdb.Pipeline()

incr := pipe.Incr(ctx, "counter")pipe.Expire(ctx, "counter", time.Hour)

// تنفيذ جميع الأوامر_, err := pipe.Exec(ctx)if err != nil { panic(err)}

fmt.Println("القيمة الجديدة للعداد:", incr.Val())


2.5 Pub/Sub

// المشتركsub := rdb.Subscribe(ctx, "mychannel")ch := sub.Channel()

for msg := range ch { fmt.Printf("تم الاستلام: %s", msg.Payload)}

// الناشر (في غوروتين آخر)rdb.Publish(ctx, "mychannel", "Hello from Go!")


2.6 العمل مع الكتلة

clusterClient := redis.NewClusterClient(&redis.ClusterOptions{    Addrs: []string{        "localhost:7000",        "localhost:7001",        "localhost:7002",    },})

// يُستخدم كعميل عاديerr := clusterClient.Set(ctx, "cluster_key", "value", 0).Err()if err != nil { panic(err)}


3. radix — خفيف وسريع

radix (github.com/mediocregopher/radix/v4) هو عميل بسيط بمستوى تجريد منخفض. ليس له تبعيات، ويعمل بشكل أسرع من go-redis في العمليات البسيطة ويعطي تحكمًا كاملاً في مستوى الشبكة.



3.1 التثبيت

go get github.com/mediocregopher/radix/v4


3

توصيات