ميمكاش

في مجال الحوسبة ، يُعدّ Memcached (يُنطق إما /mɛmkæʃˈdiː/ ميم-كاش-دي [حيث "دي/د" اختصارًا لكلمة daemon ]، أو /ˈmɛmkæʃt/ ميم-كاشد ) نظامًا عامًا لتخزين البيانات في الذاكرة الموزعة . يُستخدم غالبًا لتسريع مواقع الويب الديناميكية التي تعتمد على قواعد البيانات ، وذلك بتخزين البيانات والكائنات مؤقتًا في ذاكرة الوصول العشوائي ( RAM) لتقليل عدد مرات قراءة مصدر البيانات الخارجي (مثل قاعدة البيانات أو واجهة برمجة التطبيقات). Memcached برنامج مجاني ومفتوح المصدر ، مرخص بموجب رخصة BSD المعدلة . [ 2 ] يعمل Memcached على أنظمة تشغيل شبيهة بنظام Unix ( Linux و macOS ) وعلى نظام Microsoft Windows . ويعتمد على مكتبة libevent .

توفر واجهات برمجة تطبيقات Memcached جدول تجزئة ضخمًا موزعًا على عدة أجهزة. عند امتلاء الجدول، تؤدي عمليات الإدخال اللاحقة إلى حذف البيانات الأقدم بترتيب الأقل استخدامًا مؤخرًا (LRU). [ 3 ] [ 4 ] عادةً ما تقوم التطبيقات التي تستخدم Memcached بتخزين الطلبات والإضافات في ذاكرة الوصول العشوائي (RAM) قبل اللجوء إلى مخزن بيانات أبطأ، مثل قاعدة البيانات.

لا يمتلك Memcached آلية داخلية لتتبع حالات عدم العثور على البيانات. ومع ذلك، توفر بعض الأدوات الخارجية هذه الوظيفة.

طُوِّرَ برنامج Memcached لأول مرة بواسطة براد فيتزباتريك لموقعه الإلكتروني LiveJournal في 22 مايو 2003. [ 5 ] [ 6 ] كُتِبَ البرنامج في الأصل بلغة Perl ، ثم أُعيدَت كتابته لاحقًا بلغة C بواسطة أناتولي فوروبي، الذي كان يعمل لدى LiveJournal آنذاك. [ 7 ] يُستخدم Memcached الآن من قِبَل العديد من الأنظمة الأخرى، بما في ذلك YouTube ، [ 8 ] وReddit ، [ 9 ] وFacebook ، [ 10 ] [ 11 ] وPinterest ، [ 12 ] [ 13 ] وTwitter ، [ 14 ] وWikipedia ، [ 15 ] و Method Studios . [ 16 ] كما تُقدِّم Google App Engine و Google Cloud Platform و Microsoft Azure و IBM Bluemix و Amazon Web Services خدمة Memcached من خلال واجهة برمجة التطبيقات (API). [ 17 ] [ 18 ] [ 19 ] [ 20 ]

هندسة البرمجيات

يستخدم النظام بنية خادم-عميل . تحتفظ الخوادم بمصفوفة ترابطية من نوع مفتاح-قيمة ؛ يقوم العملاء بتعبئة هذه المصفوفة والاستعلام عنها باستخدام المفتاح. يصل طول المفاتيح إلى 250 بايت، بينما لا يتجاوز حجم القيم 1 ميجابايت .

يستخدم العملاء مكتبات من جانب العميل للاتصال بالخوادم، التي تعرض خدماتها افتراضيًا على المنفذ 11211. يدعم النظام بروتوكولي TCP وUDP. يعرف كل عميل جميع الخوادم، ولا تتواصل الخوادم فيما بينها. إذا رغب عميل في تعيين أو قراءة القيمة المقابلة لمفتاح معين، تقوم مكتبة العميل أولًا بحساب تجزئة للمفتاح لتحديد الخادم المناسب. يوفر هذا شكلًا بسيطًا من التجزئة وبنية قابلة للتوسع لا تعتمد على مشاركة البيانات بين الخوادم. يحسب الخادم تجزئة ثانية للمفتاح لتحديد مكان تخزين أو قراءة القيمة المقابلة. تحتفظ الخوادم بالقيم في ذاكرة الوصول العشوائي (RAM) (وبدءًا من الإصدار 1.6.0، في ذاكرة تخزين مؤقتة إضافية على القرص باستخدام خيار خادم تخزين خارجي)؛ [ 21 ] إذا نفدت الذاكرة أو مساحة القرص المتاحة على أحد الخوادم، فإنه يتخلص من أقدم القيم. لذلك، يجب على العملاء التعامل مع Memcached كذاكرة تخزين مؤقتة مؤقتة؛ فلا يمكنهم افتراض أن البيانات المخزنة في Memcached لا تزال موجودة عند الحاجة إليها. توفر قواعد البيانات الأخرى، مثل MemcacheDB و Couchbase Server ، تخزينًا دائمًا مع الحفاظ على توافق بروتوكول Memcached.

إذا استخدمت جميع مكتبات العميل نفس خوارزمية التجزئة لتحديد الخوادم، فيمكن للعملاء قراءة البيانات المخزنة مؤقتًا لبعضهم البعض.

يتضمن النشر النموذجي عدة خوادم والعديد من العملاء. مع ذلك، من الممكن استخدام Memcached على جهاز كمبيوتر واحد، حيث يعمل كعميل وخادم في آن واحد. غالبًا ما يكون حجم جدول التجزئة الخاص به كبيرًا جدًا، ولكنه محدود بالذاكرة المتاحة لجميع الخوادم في مجموعة الخوادم بمركز البيانات. وعندما يتطلب النشر الإلكتروني عالي الحجم وواسع النطاق ذلك، قد يصل هذا الحجم إلى عدة غيغابايت. يُعد Memcached ذا قيمة مماثلة في الحالات التي يكون فيها عدد طلبات المحتوى مرتفعًا، أو تكلفة إنشاء محتوى معين مرتفعة. يمكن للتطبيقات ذات احتياجات التخزين المؤقت العالية استخدام وكيل مدمج لتحديد وتكوين مسارات معقدة بين العميل والخادم. [ 21 ]

حماية

تُنشر معظم تطبيقات Memcached ضمن شبكات موثوقة حيث يمكن للعملاء الاتصال بأي خادم بحرية. مع ذلك، يُنشر Memcached أحيانًا في شبكات غير موثوقة أو عندما يرغب المسؤولون في التحكم بالعملاء المتصلين. لهذا الغرض، يمكن تجميع Memcached مع دعم اختياري لمصادقة SASL . يتطلب دعم SASL بروتوكولًا ثنائيًا.

كشف عرض تقديمي في مؤتمر بلاك هات الولايات المتحدة الأمريكية 2010 أن عدداً من المواقع الإلكترونية العامة الكبيرة تركت برنامج Memcached مفتوحاً للتفتيش والتحليل والاسترجاع وتعديل البيانات. [ 22 ]

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

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

يُستخدم كأداة لشن هجمات DDoS

في فبراير 2018، أفادت شركة كلاود فلير بأن خوادم ميمكاش ذات إعدادات خاطئة استُخدمت لشنّ هجمات حجب الخدمة الموزعة (DDoS) على نطاق واسع. [ 23 ] يتميز بروتوكول ميمكاش عبر بروتوكول UDP بمعامل تضخيم هائل يتجاوز 51000. [ 24 ] ومن بين ضحايا هجمات DDoS موقع غيت هاب ، الذي غمرته  حركة مرور واردة بلغت ذروتها 1.35 تيرابت/ثانية. [ 25 ]

تم التخفيف من هذه المشكلة في الإصدار 1.5.6 من Memcached، والذي قام بتعطيل بروتوكول UDP افتراضيًا. [ 26 ]

مثال على التعليمات البرمجية

لاحظ أن جميع الدوال الموضحة في هذه الصفحة هي مجرد رموز زائفة . قد تختلف استدعاءات Memcached ولغات البرمجة المستخدمة بناءً على واجهة برمجة التطبيقات (API).

يُعدّ تحويل استعلامات إنشاء قواعد البيانات أو الكائنات لاستخدام Memcached أمرًا بسيطًا. عادةً، عند استخدام استعلامات قواعد البيانات المباشرة، يكون مثال الكود كما يلي:

دالة get_foo ( int userid ) data = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ) return data

بعد التحويل إلى Memcached، قد تبدو نفس المكالمة كما يلي

دالة get_foo ( int userid ) /* جرب أولاً ذاكرة التخزين المؤقت */ data = memcached_fetch ( "userrow:" + userid ) إذا لم يتم العثور على البيانات /* غير موجودة: اطلب من قاعدة البيانات */ data = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ) /* ثم خزّنها في ذاكرة التخزين المؤقت حتى يتم جلبها مرة أخرى */ memcached_add ( "userrow:" + userid , data ) نهايةبيانات الإرجاع

يتحقق العميل أولاً من وجود قيمة في Memcached تحمل المفتاح الفريد "userrow:userid"، حيث يمثل userid رقمًا. إذا لم تكن القيمة موجودة، فإنه يستعلم من قاعدة البيانات كالمعتاد، ثم يُعيّن المفتاح الفريد باستخدام استدعاء دالة الإضافة في واجهة برمجة تطبيقات Memcached.

مع ذلك، إذا تم تعديل استدعاء واجهة برمجة التطبيقات هذا فقط، فسيؤدي ذلك إلى جلب الخادم لبيانات غير صحيحة بعد أي عملية تحديث لقاعدة البيانات، حيث ستصبح "عرض" البيانات في Memcached قديمة. لذا، بالإضافة إلى إنشاء استدعاء "إضافة"، يلزم أيضًا إنشاء استدعاء "تحديث" باستخدام دالة set في Memcached.

دالة تحديث_foo ( int userid , string dbUpdateString ) /* تحديث قاعدة البيانات أولاً */ result = db_execute ( dbUpdateString ) if result /* تم تحديث قاعدة البيانات بنجاح: جلب البيانات المراد تخزينها في الذاكرة المؤقتة */ data = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ) /* يمكن أن يبدو السطر السابق أيضًا كالتالي: data = createDataFromDBString(dbUpdateString) */ /* ثم تخزينها في الذاكرة المؤقتة حتى يتم جلبها مرة أخرى */ memcached_set ( "userrow:" + userid , data )

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

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

دالة `store_xyz_entry` ( مفتاح عدد صحيح ، قيمة سلسلة نصية ) /* استرجاع الرقم العشوائي - استخدم الصفر إذا لم يكن موجودًا بعد.  * اسم المفتاح المستخدم هنا اختياري. */ seed = memcached_fetch ( ":xyz_seed:" ) if not seed seed = 0 /* إنشاء المفتاح المستخدم لتخزين الإدخال وتخزينه.  * اسم المفتاح المستخدم هنا اختياري أيضًا. لاحظ أن "seed" و"key" الخاص بالمستخدم  * يتم تخزينهما كجزأين منفصلين من سلسلة hashKey المُنشأة: ":xyz_data:(seed):(key)."  * هذا ليس إلزاميًا، ولكنه مُوصى به. */ string hashKey = sprintf ( ":xyz_data:%d:%d" , seed , key ) memcached_set ( hashKey , value )/* "fetch_entry"، غير معروضة، تتبع نفس المنطق المذكور أعلاه. */دالة invalidate_xyz_cache () / * استدعاء دالة memcached_fetch ( ) لجلب قيمة البذرة الموجودة في الذاكرة المؤقتة ( :xyz_seed:) /* إنشاء بذرة عشوائية مختلفة */ do seed = rand () until seed != existing_seed /* الآن، قم بتخزينها في المكان المتفق عليه. ستستخدم جميع الطلبات المستقبلية هذا الرقم. * لذلك ،  ستصبح جميع الإدخالات الموجودة غير مُشار إليها وستنتهي صلاحيتها في النهاية. * / memcached_set ( )

الاستخدام

انظر أيضاً

مراجع

  1. "الإصدار 1.6.45" . 10 يوليو 2026. تم الاطلاع عليه في 10 يوليو 2026 .
  2. 1 2 "رخصة Memcached" . GitHub . تم الاسترجاع في 27-06-2014 .
  3. "أرشيف جوجل كود - تخزين طويل الأمد لاستضافة مشاريع جوجل كود" . Code.google.com . تم الاطلاع عليه بتاريخ 25-06-2017 .
  4. "أرشيف جوجل كود - تخزين طويل الأمد لاستضافة مشاريع جوجل كود" . Code.google.com . تم الاطلاع عليه بتاريخ 25-06-2017 .
  5. Community.livejournal.com (22-05-2003). تم الاطلاع عليه بتاريخ 18-09-2013.
  6. Community.livejournal.com (27-05-2003). تم الاطلاع عليه بتاريخ 18-09-2013.
  7. "lj_dev: memcached" . 2013-02-25. مؤرشف من الأصل في 2013-02-25 . تم الاسترجاع في 2017-06-25 .
  8. كوانغ دو كوانغ (مدير هندسة في يوتيوب/جوجل) (23 يونيو 2007). مؤتمر سياتل حول قابلية التوسع: قابلية التوسع في يوتيوب (فيديو عبر الإنترنت - الدقيقة 26). سياتل: محادثات جوجل التقنية.
  9. ويتاكر، كير (17 مايو 2010). "ستيف هوفمان يتحدث عن الدروس المستفادة من ريديت | كارسونيفايد" . مؤرشف من الأصل بتاريخ 17 مايو 2010. تم الاطلاع عليه بتاريخ 25 يونيو 2017 .
  10. "توسيع نطاق استخدام memcached في فيسبوك" . Facebook.com . 12-12-2008 . تم الاطلاع عليه بتاريخ 25-06-2017 .
  11. توسيع نطاق Memcache في فيسبوك . USENIX. 2002. ISBN 9781931971003تم الاطلاع عليه بتاريخ 25-06-2017 .
  12. "بناء منصة بينترست السحابية" . وظائف بينترست . 19-06-2013 . تم الاطلاع عليه بتاريخ 09-03-2018 .
  13. "عميل memcached شامل وسريع مكتوب بلغة بايثون بالكامل" . Github.com . 2018-01-08 . تم الاطلاع عليه بتاريخ 2018-03-09 .
  14. "ليس الأمر معقداً، لكنه عملنا" . Blog.twitter.com . 2008-06-01 . تم الاطلاع عليه بتاريخ 2017-06-25 .
  15. "memcached" . ميدياويكي . تم الاسترجاع في 25-06-2017 .
  16. ريز بوف، سيغراف 2019 ، مؤرشف من الأصل بتاريخ 12 ديسمبر 2021 ، تم الاطلاع عليه بتاريخ 9 أغسطس 2019
  17. "أمثلة على استخدام Memcache | بيئة App Engine القياسية للغة Python | منصة Google Cloud" . Code.google.com . 22-03-2017 . تاريخ الاسترجاع: 25-06-2017 .
  18. "حول ذاكرة التخزين المؤقت داخل الدور لـ Azure Cache" . Msdn.microsoft.com . 2015-08-25 . تم الاطلاع عليه بتاريخ 2017-06-25 .
  19. فيرج، جيسون (23 سبتمبر 2014). "مختبرات ريديس: لدينا 3000 عميل يدفعون مقابل خدمات NoSQL السحابية في الذاكرة" . معلومات مركز البيانات . تم الاسترجاع في 10 سبتمبر 2016 .
  20. "AWS | Amazon ElastiCache – مخزن بيانات وذاكرة تخزين مؤقتة في الذاكرة" . Aws.amazon.com . تم الاطلاع عليه بتاريخ 25-06-2017 .
  21. 1 2 ماكنتوش، جيسون (14 فبراير 2025). "تطور ميمكاشد" . LWN . تم الاسترجاع في 14 فبراير 2025 .
  22. "SensePost | مقال عن قراصنة القبعة السوداء: Go-derper وتعدين ذاكرة التخزين المؤقت" . مؤرشف من الأصل بتاريخ 21-12-2018 . تم الاطلاع عليه بتاريخ 02-09-2016 .
  23. "Memcrashed - هجمات تضخيم كبيرة من منفذ UDP 11211" . كلاود فلير. 27 فبراير 2018. تم الاطلاع عليه في 3 مارس 2018 .
  24. جيفري، كال (1 مارس 2018). "GitHub يقع ضحية لأكبر هجوم DDoS تم تسجيله على الإطلاق" .
  25. "تقرير حادثة هجوم الحرمان من الخدمة الموزع بتاريخ 28 فبراير" . 1 مارس 2018. تم الاطلاع عليه بتاريخ 3 مارس 2018 .
  26. "ملاحظات إصدار Memcached 1.5.6" . GitHub . 27 فبراير 2018. تم الاطلاع عليه في 3 مارس 2018 .
  27. "Speedy MySQL 5.6 يستهدف NoSQL وMariaDB" . Theregister.co.uk . تاريخ الاطلاع: 25 يونيو 2017 .
  28. ديفيد فيلسي (13 أغسطس 2014). "البدء باستخدام محول Coherence Memcached | مدونة Oracle Coherence" . Blogs.oracle.com . مؤرشف من الأصل بتاريخ 23 فبراير 2017. تم الاطلاع عليه بتاريخ 25 يونيو 2017 .
  29. "استخدام نقطة نهاية بروتوكول Memcached مع Infinispan" . infinispan.org . تم الاطلاع عليه بتاريخ 19-04-2022 .