عميل Redis لـ C++: دليل شامل للعمل مع hiredis
Redis هي قاعدة بيانات شهيرة في الذاكرة (in-memory)، تُستخدم للتخزين المؤقت، إدارة الجلسات، قوائم انتظار الرسائل، وغيرها الكثير. للتفاعل مع Redis من تطبيقات C++، توجد عدة مكتبات، لكن أشهرها وأكثرها موثوقية هي hiredis. هذه المكتبة البسيطة والسريعة والمستقرة توفر واجهة برمجة تطبيقات (API) بلغة C نقية، يسهل دمجها في مشاريع C++. في هذه المقالة، سنشرح بالتفصيل كيفية تثبيت hiredis، ربطها بالمشروع، تنفيذ العمليات الأساسية مع Redis، ومعالجة الأخطاء المحتملة.
ما هي hiredis؟
hiredis هو عميل C رسمي لـ Redis، تم تطويره بواسطة نفس فريق Redis. يدعم:
- الاتصالات المتزامنة وغير المتزامنة
- إعادة الاتصال التلقائي عند انقطاع الاتصال
- إرسال الأوامر المتدفقة (pipelining)
- العمل مع البيانات الثنائية
- الدعم الكامل لبروتوكول Redis (RESP2 و RESP3)
على الرغم من أن hiredis مكتوبة بلغة C، إلا أنها مناسبة تمامًا لمشاريع C++: يمكن تغليفها في فئات RAII، واستخدامها مع مصطلحات C++11/17 الحديثة، ودمجها بسهولة مع المكتبات الأخرى.
تثبيت hiredis
أسهل طريقة للتثبيت هي عبر مدير الحزم الخاص بالنظام. أمثلة لأنظمة تشغيل مختلفة:
Ubuntu / Debian
sudo apt updatesudo apt install libhiredis-devmacOS (Homebrew)
brew install hiredisWindows (vcpkg)
vcpkg install hiredisإذا كنت تفضل بناء hiredis من المصدر (مثلاً، لتكوين مخصص):
git clone https://github.com/redis/hiredis.gitcd hiredismakesudo make installالاتصال بخادم Redis
بعد تثبيت hiredis، يمكنك ربطها بمشروع C++ الخاص بك. تأكد من تحديد مسارات ملفات الرأس والمكتبات في إعدادات المترجم:
-I/usr/include(أو المسار إلىhiredis.h)-lhiredisللربط
مثال على كود أدنى للاتصال بـ Redis يعمل على localhost:6379:
#include <hiredis/hiredis.h>#include <iostream>
int main() { // الاتصال بـ Redis redisContext *c = redisConnect("127.0.0.1", 6379); if (c == nullptr || c->err) { if (c) { std::cerr << "خطأ في الاتصال: " << c->errstr << std::endl; redisFree(c); } else { std::cerr << "فشل في تخصيص ذاكرة للسياق" << std::endl; } return 1; } std::cout << "تم إنشاء الاتصال بـ Redis!" << std::endl;
// تحرير الموارد redisFree(c); return 0;}إرسال الأوامر واستلام الردود
توفر hiredis الدالة redisCommand لإرسال الأوامر. تُرجع مؤشرًا إلى redisReply، الذي يحتوي على نتيجة التنفيذ. تحقق دائمًا من أن الرد ليس nullptr، وحرر الذاكرة بعد الاستخدام.
لننظر إلى العمليات الأساسية: تعيين قيمة سلسلة نصية والحصول عليها.
#include <hiredis/hiredis.h>#include <iostream>#include <string>
int main() { redisContext *c = redisConnect("127.0.0.1", 6379); if (!c || c->err) { std::cerr << "خطأ في الاتصال: " << (c ? c->errstr : "null") << std::endl; return 1; }
// تعيين المفتاح "myname" بالقيمة "C++ Developer" redisReply *reply = (redisReply*)redisCommand(c, "SET myname 'C++ Developer'"); if (reply == nullptr) { std::cerr << "خطأ في تنفيذ الأمر SET" << std::endl; redisFree(c); return