عميل 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/v92.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