مقدمة إلى go-redis: عميل Redis قوي للغة Go
\n\nRedis هو مخزن بيانات عالي الأداء من نوع "مفتاح-قيمة" يعمل في الذاكرة العشوائية. يُستخدم للتخزين المؤقت، إدارة الجلسات، قوائم انتظار الرسائل، التصنيفات، وغير ذلك الكثير. للتفاعل مع Redis من Go، توجد عدة مكتبات، و go-redis (الحزمة github.com/redis/go-redis/v9) هي الأكثر شهرة، والنشطة في الصيانة، والأكثر وظيفية.
توفر هذه المكتبة واجهة برمجة تطبيقات 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:
go get github.com/redis/go-redis/v9\n\nبعد تنفيذ هذا الأمر، سيظهر تبعية (dependency) في ملف go.mod الخاص بك. تأكد من أن لديك Go الإصدار 1.18 أو أعلى.
ستحتاج أيضاً إلى خادم Redis يعمل (محلياً أو عن بعد). للاختبار، يمكنك تشغيل Redis في Docker:
\n\ndocker run --name my-redis -p 6379:6379 -d redis\n\nبداية سريعة: الاتصال وإجراء أول طلب
\n\nأنشئ ملفاً باسم main.go واكتب برنامجاً بسيطاً يتصل بـ Redis، ويكتب ويقرأ قيمة.
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\ngo run main.go\n\nيجب أن ترى:
\n\nتم الاتصال: PONG\nname: Alice\n\nالطرق الأساسية في go-redis (8 طرق فأكثر)
\n\nجميع طرق go-redis تُرجع كائن *Cmd (أو تخصصاته)، والذي يحتوي على طريقة .Result() للحصول على النتيجة والخطأ، .Val() للحصول على القيمة فقط، و .Err() للحصول على الخطأ فقط. هذا يسمح بمعالجة النتائج بمرونة.
1. Set — تعيين قيمة مفتاح
\nما يفعله: يعيّن قيمة للمفتاح المحدد. يمكن تعيين وقت حياة (TTL) أو 0 للتخزين الدائم.
\nالمعلمات:
\n- \n
ctx context.Context— سياق لإدارة وقت التنفيذ \n key string— اسم المفتاح \n value interface{}— القيمة (سيتم تسلسلها) \n expiration time.Duration— وقت الحياة (0 يعني بدون TTL) \n
مثال:
\nerr := rdb.Set(ctx, "