العمل حول افتقار Memcached إلى انتهاء صلاحية بطاقة Wildcard في التخزين المؤقت لشظايا القضبان

StackOverflow https://stackoverflow.com/questions/4013763

سؤال

أنا أعمل على إضافة موقع التخزين المؤقت لشظية إلى موقع Rails 3 الذي قام بتسجيل الدخول والمستخدمين المجهولين ، وأحتاج إلى التحكم عندما تنتهي صلاحية أجزاء من الصفحة بناءً على المحتوى المعروض في جميع أنحاء الموقع. في منتصف هذا الأمر ، اكتشفت أن memcached لا يدعم regexps لـ Expire_fragment ، لذا الآن أبحث عن طرق حول هذا.

بالنسبة للمستخدمين المجهولين ، هذه ليست مشكلة كبيرة. أقوم بإنشاء مفاتيح ذاكرة التخزين المؤقت مثل "FrontPage-New-Shows" أو "الجدول الزمني لكل أسبوع-10/24/20" وأقوم بإنهاء صلاحيتها عند إجراء إدخال جديد في نموذج العرض ، أو عندما يتم عرض عرض خلال الأسبوع المقبل يتم تعديله عبر الكنس. هذا يعمل بشكل جيد.

مشكلتي هي مع المستخدمين الذين قاموا بتسجيل الدخول. لديهم جدول زمني مخصص خاص به ، لذلك يبدو أن مفاتيحي تبدو مثل "الجدول الزمني-المستخدم-jschuur-10/10/24 'مع كون Jschuur اسم المستخدم للحساب. أنا أفهم أنه مع الاتفاقية القائمة على التاريخ ، فإنها تنتهي صلاحيتها بشكل طبيعي ، لكنني أريد أيضًا أن تنتهي صريحًا من جميع الأجزاء للجداول المخزنة مؤقتًا خلال اليوم الذي تحدث فيه التغييرات ذات الصلة لشيء ما في جدولك لهذا اليوم (أو الأسبوع).

كما اتضح ، لا يمكن لـ Memcached القيام بنوع انتهاء صلاحية البطاقة البرية التي أحتاجها هنا (الجدول الزمني-.*-10/10/24). هذا يعني أنني بحاجة إلى نوع من الحلول التي تخزن جميع المفاتيح الصادرة في مفتاح البحث المركزي في Memcached ، أو أن لديّ قضبان/روبي بطريقة ما داخليًا استنادًا إلى المفاتيح التي أرسلتها إلى Memcached من أجلي.

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

هل تعامل شخص ما بالفعل مع هذه المشكلة وأصدر حلاً؟

شيء واحد يجب مراعاته هو أن كل التخزين المؤقت تقريبًا يتم حاليًا مع عبارات في الرأي ، الموجهة نحو Activerelations استعلامات أعدت لم يتم إطلاقها بعد ، مثل هذا:

<% if current_user %>
  <% if current_user.saved_shows_count %>
    <% cache "schedule-user-#{current_user.username}-#{(Time.now + 3.hours).to_date.end_of_week.strftime('%D')}" do %>
      <% if @shows.any? %>
        <%= render :partial => "schedule/schedule", :locals => { :shows => @shows } %>
      <% end %>
    <% end %>
...

يتم استضافة الموقع على Heroku وأنا أستخدم GEM Dalli كعميل.

هل كانت مفيدة؟

المحلول

تعديل: هناك بعض المشكلات مع هذا كما هو مكتوب مع GEM Dalli ، القيام بقراءة يرفع "بيانات مارشال قصيرة جدا" أو "بيانات غير صالحة في Memcache" بالنسبة لي. لست متأكدًا مما إذا كان ذلك لك أيضًا.

على الرغم من أنه بعض الاختراق ، إلا أنه يمكنك استخدام مساحة الاسم ثم زيادة مساحة الاسم ، وبالتالي إبطال جميع المفاتيح التي تم إنشاؤها باستخدامه. للقيام بذلك ، قم أولاً بتعيين مساحة الاسم في مُهيئ (أو في أي مكان) مع Rails.cache.write("frontpage-new-shows-namespace", "1", {:raw => true}). عند تعيين كل ذاكرة التخزين المؤقت ، أضف Rails.cache.read("frontpage-new-shows-namespace") في مفتاح التجزئة أينما تريد (لا يهم حقًا أين). إن انتهاء صلاحية جميع مفاتيح ذاكرة التخزين المؤقت التي تم إنشاؤها في مساحة الاسم سهلة مثل Rails.cache.increment("frontpage-new-shows-namespace", 1). قد تكون قادرًا على إضافة Rails.cache.read("frontpage-new-shows-namespace") كمتغير عالمي ، تخلص من عمليات البحث عن Memcache لإنشاء مفاتيح ذاكرة التخزين المؤقت ، ثم قم بتحديث هذا المتغير كلما قمت بزيادة مساحة الاسم ذاكرة التخزين المؤقت.

حظا سعيدا ، وآمل أن يساعد هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top