- يقوم Redis بتخزين البيانات في الذاكرة باستخدام هياكل متقدمة وعمليات ذرية.
- يدعم الاستمرارية (RDB/AOF)، والتكرار غير المتزامن، والأدوات مثل Pub/Sub وLua.
- مثالي للتخزين المؤقت والجلسات والمراسلة والتصنيفات مع زمن انتقال منخفض للغاية.
إذا كنتَ بحاجةٍ يومًا ما إلى تشغيل تطبيقك بسرعة الصاروخ، فربما سمعتَ عن Redis. تعمل هذه التقنية كنظام بيانات في الذاكرة يوفر زمن انتقال منخفض جدًا واستجابات فورية تقريبًا، مثالي عندما تكون السرعة هي الأولوية المطلقة.
أكثر من مجرد ذاكرة تخزين مؤقت، Redis هي قاعدة بيانات NoSQL تعتمد على نظام المفتاح والقيمة ، وتضم هياكل بيانات متعددة وأدوات متكاملة. أُطلقت في الأصل عام 2009 وكُتبت بلغة C، واسمها مشتق من Remote Dictionary Server (خادم القاموس عن بُعد) . اليوم، تتميز Redis بنظام بيئي نشط للغاية، وعملاء يدعمون تقريبًا جميع لغات البرمجة، وقدرات قوية على التخزين والنسخ المتماثل.
ما هو Redis وما هي استخداماته؟
Redis هو محرك تخزين في الذاكرة يعمل مع أزواج المفاتيح والقيم والهياكل المتقدمة. وبفضل تشغيله في ذاكرة الوصول العشوائي (RAM)، فإنه يقلل من الاختناقات المعتادة في الوصول إلى القرص ، مما يجعله مثاليًا لحالات الاستخدام التي تتطلب سرعة فائقة: مثل ذاكرات التخزين المؤقت للاستعلامات المكثفة، وجلسات المستخدمين، والمراسلة الفورية، والألعاب عبر الإنترنت، ولوحات المعلومات التي تعرض البيانات المتدفقة، وغيرها.
في العديد من المشاريع، يُستخدم كطبقة تخزين مؤقت أمام قواعد البيانات التقليدية ، حيث يخزن النتائج المتكررة لتجنب إعادة الحساب أو الاستعلام بشكل مستمر. كما يُستخدم كقاعدة بيانات بحد ذاته عندما لا يكون ضمان استمرارية البيانات شرطًا أساسيًا، أو عندما يتم ضبط إعدادات استمراريته لضمان تخزين البيانات على القرص.
بفضل بنيته القائمة على نموذج العميل/الخادم، وواجهة الشبكة، وتصميمه الخفيف، يسهل نشره والاتصال به من عدة مضيفين. علاوة على ذلك، يوفر خاصية النسخ غير المتزامن من الخادم الرئيسي إلى النسخة المتماثلة (حيث يستمر الخادم الرئيسي في العمل أثناء النسخ)، مما يساعد على توسيع نطاق عمليات القراءة وتحسين التوافر.
دلائل الميزات
تكمن قوة Redis في أن جميع البيانات موجودة في الذاكرة الرئيسية. هذا يُلغي الحاجة إلى الوصول إلى القرص أثناء المسار الحرج، ويُوفر عمليات قراءة/كتابة فائقة السرعة . علاوة على ذلك، يمكن أن يصل حجم كل سلسلة نصية إلى 512 ميجابايت، مع دعم البيانات الثنائية، ويشمل ذلك هياكل مثل القوائم، والمجموعات، والمجموعات المُرتبة، والجداول التجزئية، وHyperLogLog، والخرائط النقطية، والجداول المتدفقة.
يُنفذ Redis عمليات ذرية عالية المستوى من جانب الخادم على هذه البنى. وهذا يسمح لك بإجراء عمليات الاتحاد والتقاطع والفرق على المجموعات، وتعديل السلاسل الفرعية، أو زيادة وإنقاص الأعداد الصحيحة والعشرية دون حدوث تضارب في البيانات.
يتضمن أدوات تعمل على تسريع التطوير وتبسيط الأنماط الشائعة: النشر/الاشتراك للنشر والاشتراك في القنوات (مثالي للمراسلة والإشعارات في الوقت الفعلي)، والمفاتيح مع TTL للانتهاء التلقائي، والعدادات الذرية للمقاييس والتحكم في التزامن، والدعم المضمن لبرامج Lua النصية لمنطق جانب الخادم من الإصدار 2.6.
ومن المزايا القوية الأخرى توافقه مع الوحدات النمطية. إذ تُوسّع وحدات Redis النمطية إمكانيات مثل مستندات JSON ، والسلاسل الزمنية، والبحث ، مما يجعلها نظامًا متعدد الاستخدامات يتجاوز بكثير مجرد ربط المفاتيح بالقيم.

التاريخ والتراخيص والتطور
أُنشئت منصة Redis عام 2009 على يد سالفاتور سانفيليبو لتحسين زمن استجابة منتج يُدعى LLOGG. حققت المنصة نجاحًا فوريًا، وفي عام 2010، عيّنت شركة VMware سانفيليبو لإدارة المشروع بدوام كامل ، وانضم إليه بيتر نوردهاوس بعد ذلك بفترة وجيزة. بين عامي 2013 و2015، رعتها شركة Pivotal، ثم لاحقًا شركة Redis Labs.
منذ الإصدار 2.6، تم دمج مترجم لغة Lua في الخادم، مما يتيح تنفيذ البرامج النصية مباشرةً داخل Redis مع ضمان التكامل التام وتقليل زمن الاستجابة بين العميل والخادم. أما فيما يتعلق بالترخيص، فيتم توزيعه بموجب نموذج ترخيص مزدوج RSALv2 وSSPLv1.
نموذج البيانات والعمليات
يستخدم Redis قاموسًا عامًا يربط المفاتيح بالقيم. على عكس حلول المفتاح والقيمة الأبسط، يمكن أن تكون القيم من أنواع مختلفة. يحدد النوع الأوامر المتاحة والعمليات الذرية التي يمكنك تنفيذها على تلك البيانات.
يُعدّ نوع البيانات String في Redis آمنًا للاستخدام مع البيانات الثنائية: إذ يمكن أن يحتوي على نصوص، أو أعداد صحيحة، أو أعداد عشرية، أو بيانات ثنائية خام مثل صورة JPEG أو كائن مُسلسل. يمكنك إجراء عمليات على أجزاء من السلسلة، أو تعديل بتات مُحددة ، أو استخدامها كعداد مع زيادات/نقصان.
تتيح لك القوائم إدارة الطوابير أو الأكوام، وتُستخدم المجموعات والمجموعات المرتبة للعضوية والترتيب حسب النتيجة، بينما تخزن التجزئات خرائط قيم الحقول، وهي مفيدة جدًا لتجميع سمات الكائن . يُستخدم HyperLogLog لعدادات الكاردينالية التقريبية مع ذاكرة قليلة جدًا، وتُسهّل التدفقات تدفقات الأحداث مع الاستهلاك المُجمّع.
علاوة على ذلك، يوفر Redis ميزة المعاملات (MULTI/EXEC)، مما يسمح لك بتجميع عمليات متعددة لتنفيذها بشكل متسلسل وذري . وبالاقتران مع لغة Lua، يمكنك تغليف منطق الخادم المعقد بشكل موثوق.
الاستمرارية: اللقطات وAOF
يمكن لـ Redis العمل في الذاكرة فقط، ولكنه يدعم أيضًا التخزين على القرص لتحقيق التوازن بين الأداء والمتانة. باستخدام اللقطات (RDB)، يأخذ Redis لقطات دورية من مجموعة البيانات ويحفظها بشكل غير متزامن، مما يقلل من تأثيرها على وقت الاستجابة.
الخيار الآخر هو AOF (التسجيل)، الذي يسجل كل عملية كتابة في ملف. يوفر هذا الوضع متانة أدق وأكثر قابلية للتخصيص: `appendfsync=always` يفرض المزامنة عند كل تغيير (أقصى أمان، أداء أقل)، و` appendfsync=everysec` يقوم بالمزامنة كل ثانية (توازن رائع).
إذا لزم الأمر، يمكنك أيضًا إجراء حفظ يدوي لفرض إنشاء لقطة فورية. في حالة تعطل الجهاز بالكامل، ستفقد عادةً كمية صغيرة من البيانات على الأكثر، وذلك بحسب سياسة المزامنة المختارة.
في الإصدارات القديمة، كان استخدام "الذاكرة الافتراضية" مسموحًا به بدءًا من الإصدار 2.4، ولكن هذا الأسلوب أصبح الآن قديمًا. يُنصح اليوم بالاختيار بين RDB أو AOF أو مزيج منهما ، مع تعديل الإعدادات وفقًا لأهمية البيانات والأداء المطلوب.
التكرار والتوافر العالي
يُطبّق Redis آلية النسخ المتماثل غير المتزامن بين الخادم الرئيسي والنسخ المتماثلة. وهذا يعني قبول عمليات الكتابة على الخادم الرئيسي ومزامنة النسخ المتماثلة دون تعطيله، مما يُحافظ على استمرارية عمل الخدمة أثناء عمليات المزامنة . يمكن أن يحتوي الخادم الرئيسي على عدة نسخ متماثلة، وبدورها، يمكن ربط نسخة متماثلة كخادم رئيسي لنسخة متماثلة أخرى، لتشكيل بنية شجرية.
تُعدّ النسخ المتماثلة مفيدة جدًا لتوسيع نطاق عمليات القراءة ولضمان التكرار. تسمح بعض الإعدادات بالكتابة إلى النسخ المتماثلة، إلا أن ذلك قد يؤدي إلى عدم اتساق البيانات إذا لم يتم التحكم فيه بشكل صحيح؛ وبشكل افتراضي، تُستخدم النسخ المتماثلة عادةً للقراءة فقط للحفاظ على الاتساق.
يساهم وضع النسخ الاحتياطية بالقرب من المستخدمين في تقليل زمن الاستجابة الملحوظ. وباستخدام أدوات التنسيق والمراقبة/المجموعة، يمكن تحقيق توافر عالٍ وتجاوز تلقائي للأعطال لتقليل وقت التوقف في حالة تعطل الخادم الرئيسي.
هندسة العميل/الخادم والنظام البيئي
يوفر خادم Redis بروتوكولًا بسيطًا تتصل به تطبيقات العملاء بلغات برمجة مختلفة. يمكنك التفاعل مع واجهة سطر الأوامر الرسمية (redis-cli) للاختبار أو الإدارة أو كتابة البرامج النصية السريعة، أو دمج مكتبة في تطبيقك.
تتوفر تطبيقات لـ ActionScript وC وC++ وC# وJava وGo وPython وPHP وRuby وScala وJavaScript (بما في ذلك Node.js من جانب الخادم) وR وErlang وHaskell وLua وObjective-C وPerl وCommon Lisp وSmalltalk وTcl وIo وhaXe وPure Data وغيرها. هذا الدعم الواسع يسهل اعتماده في أي بيئة تطوير تقريبًا.
حالات الاستخدام الحقيقية والأمثلة العملية
من الأمثلة الشائعة جدًا وكالة عقارية على الإنترنت: حيث لا تتغير بيانات العقار المعروضة، بما فيها السعر والمرافق وعدد الغرف، إلا نادرًا. وبدون التخزين المؤقت، تتطلب كل زيارة استعلامات وحسابات متكررة. أما مع Redis، فبعد التحميل الأول، يُحفظ الكائن بمفتاح (مثلاً، property_4056 ) وفترة صلاحية (TTL) شهر واحد مثلاً. وتقرأ الزيارات اللاحقة البيانات من الذاكرة دون الحاجة إلى الوصول إلى قاعدة البيانات.
ومن الشائع أيضًا تخزين نتائج التقارير الثقيلة مؤقتًا ، وإدارة الجلسات المصادقة، وبناء تصنيفات مباشرة باستخدام مجموعات مرتبة، أو استخدام Pub/Sub كقناة مراسلة خفيفة الوزن بين الخدمات.
في اختبارٍ باستخدام جدول أخطاء يحتوي على 16.000 صف، تم قياس الوقت اللازم لـ: 1) الاستعلام عن قاعدة البيانات، 2) حفظ البيانات في Redis، و3) القراءة من Redis. وكانت النتيجة مذهلة: استرجاع البيانات من Redis أسرع بـ 26 مرة من استرجاعها من قاعدة البيانات. غالبًا ما تُبرز هذه المقارنات التأثير الحقيقي على تجربة المستخدم وتكاليف البنية التحتية.
Redis مقابل Memcached
تُستخدم كلتا التقنيتين للتخزين المؤقت في الذاكرة، لكن ثمة اختلافات ملحوظة بينهما. يوفر Redis أنواع بيانات متعددة (قوائم، مجموعات، تجزئات، إلخ)، وخيار التخزين على القرص ، ونظام النشر/الاشتراك، ونصوص Lua البرمجية، والمعاملات، ووحدات نمطية لتوسيع إمكانياته. أما Memcached، فيركز على نموذج بسيط لتخزين البيانات في الذاكرة على شكل مفتاح-قيمة دون تخزين دائم.
من حيث الأداء الخام، كلاهما سريع للغاية؛ ويتفوق Redis عادةً في الحالات ذات الهياكل المعقدة والعمليات الذرية على جانب الخادم. إذا كنت تحتاج فقط إلى ذاكرة تخزين مؤقتة بسيطة وخفيفة للغاية، فقد يكون Memcached كافيًا ، ولكن عندما تبحث عن مزيد من الوظائف والمرونة، فإن Redis عادةً ما يكون الخيار الأفضل.
الخدمات المُدارة مقابل الخدمات المُدارة ذاتيًا (Redis وValkey)
يمكنك نشر Redis أو Valkey بنفسك أو اختيار خدمة سحابية مُدارة. تمنحك الإدارة الذاتية تحكمًا كاملاً، لكن قابلية التوسع والصيانة تقع على عاتقك (إضافة العُقد، والتحديثات، والأمان، والنسخ الاحتياطية، والمراقبة).
تُخفف الخدمة المُدارة العبء التشغيلي، إذ تُسهّل التوسع، وتضمن توافرًا عاليًا، وتُوفر تحديثات سلسة. وينعكس ذلك عادةً على انخفاض التكلفة الإجمالية للملكية، ويُمكّن الفريق من التركيز أكثر على نمذجة البيانات ووظائف الأعمال، بدلاً من مهام المنصة.
الأدوات المتكاملة: Pub/Sub، وTTL، والعدادات، وLua
باستخدام نمط النشر/الاشتراك، يمكنك بث الرسائل في قنوات متعددة، ويتلقى العديد من المشتركين هذه الرسائل فورًا، وهو مثالي للمحادثات والإشعارات والتنسيق بين الخدمات المصغرة. إنه نمط بسيط وفعال.
تتيح لك مفاتيح وقت البقاء (TTL) "التنظيف الذاتي" للبيانات المؤقتة: الجلسات، والرموز المميزة، ونتائج الاستعلامات منتهية الصلاحية، وما إلى ذلك. وهذا يمنعك من ملء قاعدة البيانات بمعلومات قديمة ويبسط منطق انتهاء الصلاحية.
تعتبر العدادات الذرية رائعة للمقاييس، وتحديد المعدل، وقوائم الانتظار، أو أي حالة تحتاج فيها إلى إضافة/طرح بأمان في البيئات المتزامنة.
وأخيرًا، يُمكّنك دعم لغة Lua المُدمجة من تشغيل البرامج النصية بالقرب من البيانات مع ضمان ذرية البيانات. هذا يُقلل من انتقال البيانات عبر الشبكة ويسمح لك بتنفيذ عمليات معقدة في خطوة واحدة ، مما يُحسّن الاتساق والأداء.
الأسئلة الشائعة
ما هي استخدامات Redis؟ لتسريع التطبيقات باستخدام ذاكرة التخزين المؤقت في الذاكرة، والجلسات، والتصنيفات في الوقت الفعلي، والمراسلة الخفيفة باستخدام Pub/Sub، وكقاعدة بيانات NoSQL عندما يكون زمن الاستجابة أمرًا بالغ الأهمية أو عند تكوين خاصية الاستمرارية.
لماذا يتميز Redis بهذه السرعة؟ لأن البيانات موجودة في ذاكرة الوصول العشوائي (RAM)، مما يلغي عمليات الوصول إلى القرص على المسار الحرج ويوفر عمليات ذرية من جانب الخادم؛ علاوة على ذلك، فإن بروتوكوله خفيف الوزن وفعال.
هل يمكن استخدامه كقاعدة بيانات؟ نعم. إنها قاعدة بيانات NoSQL تعمل في الذاكرة مع خيارات تخزين البيانات (RDB و AOF). بناءً على إعداداتك، يمكنك إعطاء الأولوية للأداء أو المتانة ، أو الجمع بينهما.
دعم اللغة
تتوفر تطبيقات ناضجة لكل شيء تقريبًا: بايثون (redis-py)، جافا (Jedis)، نود.جي إس (ioredis)، سي شارب/.نت (StackExchange.Redis)، بي إتش بي (phpredis)، جو (go-redis)، روبي (redis-rb)، وغيرها الكثير. يضمن هذا التنوع التكامل السلس مع بنيتك التحتية الحالية.
لقد رسخت Redis مكانتها كـ "الورقة الرابحة" لحل مشاكل الأداء والوقت الحقيقي في معظم البنى الحديثة: فهي تجمع بين السرعة الفائقة، وهياكل البيانات الغنية، والاستمرارية القابلة للتكوين، والتكرار، ومجموعة من الأدوات العملية التي، عند استخدامها بشكل جيد، تحدث فرقًا في تجربة المستخدمين.