عميل Redis (go-redis) للغة Go: دليل كامل مع أمثلة

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

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

ابدأ الدورة

مقدمة إلى go-redis: عميل Redis قوي للغة Go

\n\n

Redis هو مخزن بيانات عالي الأداء من نوع "مفتاح-قيمة" يعمل في الذاكرة العشوائية. يُستخدم للتخزين المؤقت، إدارة الجلسات، قوائم انتظار الرسائل، التصنيفات، وغير ذلك الكثير. للتفاعل مع Redis من Go، توجد عدة مكتبات، و go-redis (الحزمة github.com/redis/go-redis/v9) هي الأكثر شهرة، والنشطة في الصيانة، والأكثر وظيفية.

\n\n

توفر هذه المكتبة واجهة برمجة تطبيقات Go نظيفة وموافقة للغة (idiomatic) للعمل مع جميع هياكل بيانات Redis (سلاسل، قوائم، مجموعات، تجزئات، مجموعات مرتبة، HyperLogLog، تدفقات، بيانات جغرافية مكانية) وتدعم الميزات المتقدمة مثل التجميع (clustering)، Sentinel، Pub/Sub، خطوط الأنابيب (pipelining)، ونصوص Lua. تدعم go-redis بالكامل Redis 7 و 8.

\n\n

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

\n\n

تثبيت go-redis

\n\n

يتم التثبيت باستخدام الأمر القياسي go get:

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

بعد تنفيذ هذا الأمر، سيظهر تبعية (dependency) في ملف go.mod الخاص بك. تأكد من أن لديك Go الإصدار 1.18 أو أعلى.

\n\n

ستحتاج أيضاً إلى خادم Redis يعمل (محلياً أو عن بعد). للاختبار، يمكنك تشغيل Redis في Docker:

\n\n
docker run --name my-redis -p 6379:6379 -d redis
\n\n

بداية سريعة: الاتصال وإجراء أول طلب

\n\n

أنشئ ملفاً باسم main.go واكتب برنامجاً بسيطاً يتصل بـ Redis، ويكتب ويقرأ قيمة.

\n\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "github.com/redis/go-redis/v9"\n)\n\nfunc main() {\n    // إنشاء سياق (يوصى باستخدام context.Background())\n    ctx := context.Background()\n\n    // إنشاء عميل\n    rdb := redis.NewClient(&redis.Options{\n        Addr:     "localhost:6379", // عنوان خادم Redis\n        Password: "",               // كلمة المرور (إن وجدت)\n        DB:       0,                // رقم قاعدة البيانات (الافتراضي 0)\n    })\n\n    // التحقق من الاتصال باستخدام Ping\n    pong, err := rdb.Ping(ctx).Result()\n    if err != nil {\n        panic(fmt.Sprintf("فشل الاتصال بـ Redis: %v", err))\n    }\n    fmt.Println("تم الاتصال:", pong)\n\n    // تعيين المفتاح "name" بالقيمة "Alice"\n    err = rdb.Set(ctx, "name", "Alice", 0).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    // قراءة القيمة حسب المفتاح "name"\n    val, err := rdb.Get(ctx, "name").Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println("name:", val)\n\n    // إغلاق الاتصال عند انتهاء البرنامج\n    defer rdb.Close()\n}
\n\n

قم بتشغيل البرنامج:

\n\n
go run main.go
\n\n

يجب أن ترى:

\n\n
تم الاتصال: PONG\nname: Alice
\n\n

الطرق الأساسية في go-redis (8 طرق فأكثر)

\n\n

جميع طرق go-redis تُرجع كائن *Cmd (أو تخصصاته)، والذي يحتوي على طريقة .Result() للحصول على النتيجة والخطأ، .Val() للحصول على القيمة فقط، و .Err() للحصول على الخطأ فقط. هذا يسمح بمعالجة النتائج بمرونة.

\n\n

1. Set — تعيين قيمة مفتاح

\n

ما يفعله: يعيّن قيمة للمفتاح المحدد. يمكن تعيين وقت حياة (TTL) أو 0 للتخزين الدائم.

\n

المعلمات:

\n
    \n
  • ctx context.Context — سياق لإدارة وقت التنفيذ
  • \n
  • key string — اسم المفتاح
  • \n
  • value interface{} — القيمة (سيتم تسلسلها)
  • \n
  • expiration time.Duration — وقت الحياة (0 يعني بدون TTL)
  • \n
\n

مثال:

\n
err := rdb.Set(ctx, "                    

توصيات