مقارنة بين Memcached و Redis

تحدثنا في المقال السابق عن انواع انظمة ادارة قواعد البيانات (DBMS) يمكنك الرجوع اليها إذا كنت مهتما بالتعرف عليها بشكل أفضل.والآن إذا كنت تحاول تحسين اداء تطبيق ويب مرتبط بقاعدة بيانات، لابد لك من استخدام التخزين المؤقت (Caching). وهي عملية تخزين بيانات صفحات الويب، من عمليات وصور وانواع اخرى من البيانات، باستخدام نظام يخزن البيانات في الذاكرة العشوائية او ما يعرف بنظام الكاش (Cache Systems)، وبهذا يقل الضغط على الخادم (server) حيث لا تعود هناك حاجة لاستحضار تلك البيانات من الخادم في كل مرة يطلبها المستخدم. وفي كل مرة تطرقت للنقاش حول هذه الأنظمة لابد وأنك طرحت او سمعت السؤال التالي – ميمكاشد ام ريديس؟ ميمكاشد و ريديس

في هذا المقال، سوف نقارن بينهما من كل الجوانب المهمة، لتتمكن من تحديد ايهما أفضل لنوع العمل الذي تقوم به.

اولا، كلاهما نظامي تخزين مؤقت في ذاكرة الوصول العشوائية (in-memory CS). مما يعني انهما يخزنان البيانات – ليس كلها – في ذاكرة الوصول العشوائية (RAM) الخاصة بالخادم (Server). ميمكاشد من انتاج براد فيت باتريك، صممه في البداية ليستخدمه مع موقعه الخاص، لايف جورنال في الثاني والعشرين من مايو, 2003. اما ريديس، فقد كتبه سالفا توري سانفيليبو لأول مرة في العاشر من ابريل لعام 2009.

انظمة الكاش

قبل المقارنة، لننظر الى اوجه التشابه بينهما.

  • كلاهما، انظمة قواعد بيانات تخزن بنظام المفتاح والقيمة (key-value storing Databases).
  • كلاهما مجانيتان ومفتوحتا المصدر.
  • كلاهما كتبتا بلغة البرمجة (C)، رغم ان ميمكاشد تمت كتابته اولا بلغة (Perl)، الا ان أناتولي فوروبي اعاد كتابته لاحقا بلغة (C) ايضا.

والآن، لنبدأ مقارنتنا دون اي تأخير:

أداء ميمكاشد و ريديس 

يؤثر نوع نظام الكاش الذي تستخدمه بشكل مباشر على اداء قواعد البيانات وتفاعلها مع التطبيقات المرتبطة بها. ويمكن لميمكاشد وريديس القيام بعمليات الكاش بشكل ممتاز وتحسين اداء قواعد البيانات بشكل كبير، حيث يمكنهما تخزين اجزاء من (HTML) او اي انواع اخرى من البيانات التي قد تستغرق وقت كبيرا لإحضارها من قاعدة البيانات في كل مرة.

حسنا، ترتبط هذه النقطة ارتباط وثيق بالنقطة التي تليها – انواع البيانات المدعومة – بيد ان ذلك قد يؤثر في الأداء بشكل كبير. حيث رغم اداء ميمكاشد الممتاز في عمليات التخزين المؤقت للبيانات، الا ان ذلك كل شيء! لا شيء آخر. اما ريديس، فهو أكثر من ذلك، حيث يمكنه اداء هذه العملية بكل فاعلية، الى جانب عمليات اخرى مفيدة جدا. على سبيل المثال، يمكن لريديس اداء مهمات اضافية في الخادم نفسه. وهذا غير ممكن بأي شكل من الأشكال باستخدام ميمكاشد.

انظر في الجدول التالي الى كل تلك العمليات الإضافية التي يستطيع ريديس ادائها:

الفرق بين ميمكاشد وريديس

انواع البيانات المدعومة

من حيث انواع البيانات المدعومة، فإن ميمكاشد يدعم فقط بنيتين من البيانات هما السجلات (data records) والسلاسل المكونة من مفتاح وقيمة (key-value strings). اما ريديس فهو يدعم مجموعة واسعة جدا منها، مع اوامر وخصائص اضافية للتحكم فيها كلها بل وانشائها. الى جانب ان استخدام ريديس اوبجكت (Redis Object)، يعطي القدرة على تمثيل كافة المفاتيح والقيم المخزنة معها على هيئة كائنات منفصلة، مما يسمح بفحص كل عنصر بمفرده.

يمثل الجدول التالي دليلا كاملا بكل انواع البيانات ودعمهما لها:

انواع البيانات المدعومة من ميمكاشد و ريديس

(انظمة التشغيل المدعومة (انظمة تشغيل السيرفر

لا يعد نظام التشغيل (Operating System) الذي يعمل من خلاله الخادم الخاص بقاعدة البيانات امرا يدعوا للقلق حول نوع نظام الكاش (Cache Systems) الذي ترغب في اضافته معه. حيث يدعم كل من ميمكاشد وريديس معظم انظمة التشغيل الدارج استخدامها حاليا في تشغيل الخوادم. الا إذا كان الخادم لديك يعمل بنظام يونكس (Unix) تحديدا، فهذا النظام غير مدعوم من قبل ريديس.

انظمة التشغيل في ميمكاشد وريديس

انماط ادارة الذاكرة

تعتبر كفاءه أداره الذاكرة عاملا رئيسيا في التأثير على أداء النظام. وتختلف الطريقة التي يتبعها كل من ميمكاشد وريديس في ادارة الذاكرة بشكل كبير. ولعل اهم فرق هو ان ريديس لا يخزن كافة البيانات في ذاكره الوصول العشوائي (RAM) الخاصة بالخادم. لنتفهم اولا ما هي ذاكرة الوصول العشوائية (RAM). السبب في تسميتها عشوائية الوصول (Random-Access) هو ان كل وحدات التخزين التي تتكون منها تكون متاحة للوصول بشكل مباشر إذا علم عنوانها، والسبب في وصفها بعشوائية (Random) ايضا، هو عدم قدرتها على تخزين الملفات الدائمة الذواكر الأخرى، فهي تملك القدرة فقط على تخزين البيانات الضرورية لإتمام عملية معينة بشكل مؤقت، في الوقت الذي تتفاعل معها فيه. نظام الكاش (Cache Systems) هو من يدير هذه العملية، حيث يقوم بالاحتفاظ بالبيانات المتعلقة بالعمليات المتكررة والاستعلامات (queries) وما الى ذلك، من الذاكرة الصلبة للسيرفر (Hard Drives) والتي تمثل قاعدة البيانات الرئيسية، وتبقيها في ذاكرة الوصول العشوائية (RAM) لاستعادتها بشكل أسرع دون الحاجة الى الرجوع لها في كل مرة.

إذا فالبيانات المخزنة في ذاكرة الوصول العشوائية (RAM) ليس دائمة كما قلنا، ولهذا فإن ريديس يوفر خيار الاحتفاظ بهذه البيانات في ملأت منفصلة خارج هذه الذاكرة، وبهذا يمكن الاحتفاظ بها لوقت طويل دون خسارة اي جزء منها. ولا تتم هذه العملية بشكل عشوائي او على كل البيانات، فريديس يقوم بعملية حسابية معقدة قبل كل عملية نسخ الى الذاكرة الصلبة، حيث تكون المعادلة كالآتي:

قابلية النقل في ريديس

قابلية النقل = عمر البيانات * لوق(الحجم في الذاكرة)

ثم يقوم بتخزين قيمة كم مفتاح من المفاتيح في جزء من الذاكرة الدائمة (disk) ويزيلها من ذاكرة الوصول العشوائية (RAM). مما يسمح للمستخدم بالاحتفاظ بكميات أكبر من البيانات، أكبر من اي مساحة ذاكرة وصول عشوائية.

ولكن! انتظر قليلا. فهذه الخاصية ليست الحل الأمثل دائما، حيث في حالة عدم ايجاد القيمة المطلوبة داخل ذاكرة الوصول العشوائي، سيتعين على النظام تحميل كل البيانات المخزنة في الجزء الخاص بهذه الملفات في الذاكرة الدائمة (disk) ثم الرجوع بالنتائج، وهذا قد يأخذ وقت اطول في التحميل. وتكمن المشكلة هنا المشكلة في ان ريديس لا تستجيب سوى بعد بنجاح تحميل جميع ملفات المبادلة من الذاكرة الدائمة. وبهذا، فلك حرية تخيل التضحية بكفاءة التزامن وسرعة التطبيق! إذا فهذا النمط مناسب فقط للعمليات التي تتضمن عدد قليل من العملاء، ولكنها ليست بذات الكفاءة لبرنامج كبير او موقع ذو استخدام مكثف جدا.

في لغة البرمجة (C) معظم عمليات التخزين والتفريغ لذواكر الوصول العشوائي (RAM) تتم باستخدام الوظيفتين (malloc وfree). ولكن هاتين الوظيفتين لهما مشكلة واحدة. وهي ان اقل عدم تطابق بينهما قد يسبب استهلاك أكبر في الذاكرة. اضافة الى انه كل ما زاد عدد الطلبات على الخادم، كل ما ازدادت صعوبة تدوير واعادة استخدام اجزاء الذاكرة التي خزنت الطلبات فيها مسبقا، مما يقلل من كفاءة وتجاوب الذاكرة وبالتالي بطء في الاستجابة لطلبات النظام الجديدة، واخيرا بطأ ملحوظا في تجاوب النظام او الموقع.

كل من ميمكاشد وريديس يملكان طريقة مختلفة في التعامل مع هذه المشكلات؛

ميمكاشد

ميمكاشد يوفر آلية تعرف بالقسيم الطبقي (Slab Allocation)؛ والتي تعمل على تقسيم الذاكرة الى طبقات او “مساحات” كتعبير أكثر دقة، لكل منها حجم محدد مسبقا لتخزين السجلات التي تحتوي مفاتيح وقيم مع الأخرى من نفس الحجم. وبهذا تحل مشكلة تجزيئ الذاكرة. وتعمل هذه الخاصية بشكل ممتاز جدا. الا انه قد يسبب هدرا للذاكرة، حيث يتم تخصيص حجم معين لكل مساحة كما قلنا، وتبقى هذه المساحة محتجزة سواء تم ملئها بالبيانات او لا. كما قد تخسر البيانات الكبيرة جزء منها إذا تجاوزت حجم المساحة المخصصة لها.

تقسيم ميمكاشد للذاكرة

ريديس

اما ريديس فهو يستخدم آلية متقدمة أكثر. فهو يخزن حجم الذاكرة في الشريط العلوي لمساحة الذاكرة الكلية (memory block) متبوعا بحجم الذاكرة المحدد (size) كما في الشكل التالي؛

ادارة ريديس للذاكرة

يمثل (real_ptr) مؤشر الذاكرة المستعادة بعد تلقي ارسال ريديس لطلب (malloc). يخزن ريديس حجم الذاكرة في الشريط العلوي لمساحة الذاكرة الكلية (memory block) ويبقي مساحة الذاكرة قابلة للقياس دائما، وبهذا فإن النظام يملك القدرة على استعادة المساحة المتبقية، بعد ذلك مساحة (ret_ptr). وعند الحاجة لإفساح المزيد من الذاكرة، يقوم النظام بإرسال مساحة (ret_ptr) الى نظام ادارة الذاكرة. حيث يملك الأخير القدرة على احتساب قيمة (real_ptr) ثم ازالتها لإخلاء مساحة اضافية. هذا ما يعطي ريديس ميزه عدم التسبب في اي اهدار للذاكرة.

لغات البرمجة التي تدعم ميمكاشد وريديس

قد يختلف اختيارك لإحدى انظمة الكاش عن دون غيرها اختلافا جذريا، سب لغة البرمجة المستخدمة في بناء قاعدة البيانات الخاصة بك او التطبيق الذي ترغب في اضافتها اليه. فكل من ميمكاشد وريديس ليستا مدعومتين بشكل مستقر من كل لغات البرمجة.

في الجدول التالي – تقريبا – جميع لغات البرمجة “التي لا تزال قيد الاستخدام” في الأيام الحالية ومعلومات حول دعمهما لها;

لغات البرمجة التي تدعمها ميمكاشد و ريديس

 سهولة استخدام ميمكاشد وريديس

رغم أن عمليه التثبيت والتشغيل لميمكاشد ليست بهذه السهولة، حيث يعد ريديس أسهل بكثير كما لا يوجد فيه اي تبعيات بعد عملية التنزيل. الا ان كلاما سهل الاستخدام ولا يتطلبان معرفة واسعة في البرمجة لتضمينهما في أي موقع او تطبيق. وهذا يعني ان اي مبرمج يملك الحد الأدنى للتعامل مع الكود بشكل عام، يمكنه العمل مع كلاهما بكل سهولة.

على اية حال، يبدو ان ريديس بدأ يحظى بالمزيد من الاهتمام في السنوات الأخيرة، وفقا لجوجل تريند.

شهرة ميمكاشد ضد ريديس

تذكر انه كلما زادت شعبية النظام بين اوساط المطورين، كلما زاد الدعم الفني له وزادت مصادر المعلومات التي يمكنك العثور عليها.

متى أختار ميمكاشد؟

  • عندما تحتاج الى تخزين معلومات صغيرة وثابتة نسبيا.
  • عندما لا يتطلب عملك الاحتفاظ بملفات الكاش لفترات طويلة. حيث ان ميمكاشد لا يخزن البيانات سوى في ذاكرة الوصول العشوائية (RAM). لذا فهي عرضة للفقدان.
  • يعمل ميمكاشد بأقصى فاعليه مع تخزين اجزاء كود (HTML).
  • عندما يطلب عملك ارسال طلبات متعددة في وقت واحد – حيث ان ميمكاشد متعدد القنوات (multithreaded) اما ريديس فهو احادية القناة (single-threaded).

متى أختار ريديس؟

  • عندما تحتاج إلى تخزين بيانات بتنسيقات متنوعة مثل: المصفوفات (array) والقوائم (lists) والمجاميع (sets) والمجاميع المفروزة (sorted sets).
  • عند تطلب عملك للإحتفاظ بملفات الكاش لفترات طويلة.
  • وقت يتطلب عملك معالجه البيانات المخزنة مؤقتا – الكاش – مع التخزين المؤقت الذكي.

النقاط المهمة

  1. يمكن لميمكاشد وريديس القيام بعمليات الكاش بشكل ممتاز وتحسين اداء قواعد البيانات بشكل كبير، حيث يمكنهما تخزين اجزاء من (HTML) او اي انواع اخرى من البيانات التي قد تستغرق وقت كبيرا لإحضارها من قاعدة البيانات في كل مرة.
  2. يدعم ميمكاشد فقط بنيتين من البيانات هما السجلات (data records) والسلاسل المكونة من مفتاح وقيمة (key-value strings). اما ريديس فهو يدعم مجموعة واسعة جدا منها، مع اوامر وخصائص اضافية للتحكم فيها كلها بل وانشائها.
  3. حيث يدعم كل من ميمكاشد وريديس معظم انظمة التشغيل الدارج استخدامها حاليا في تشغيل الخوادم. الا في حالة نظام اونيكس فهو غير مدعوم من ريديس.
  4. قد يختلف اختيارك لإحدى انظمة الكاش عن دون غيرها اختلافا جذريا، سب لغة البرمجة المستخدمة في بناء قاعدة البيانات الخاصة بك او التطبيق الذي ترغب في اضافتها اليه. ويدعم ريديس لغات برمجة أكثر بكثير من التي يدعمها ميمكاشد. (انظر الى الجدول رقم 4)
  5. عمليه التثبيت والتشغيل لميمكاشد ليست بهذه السهولة، حيث يعد ريديس أسهل بكثير كما لا يوجد فيه اي تبعيات بعد عملية التنزيل. الا ان كلاما سهل الاستخدام ولا يتطلبان معرفة واسعة في البرمجة.
  6. نمط ادارة الذاكرة (Slab Allocation) الخاص بنظام ميمكاشد، يوفر كفاءة عالية جدا، ولكنه قد يسبب هدرا في الذاكرة. اما الأنماط التي يوفرها ريديس فلا تسبب اي هدر في الذاكرة.

 

 

 

 

 

 

 

LEAVE A REPLY

Please enter your comment!
Please enter your name here