كيفية تنفيذ ذاكرة التخزين المؤقت المشتركة بشكل صحيح في ColdFusion؟

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

سؤال

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

  • مشاركة CFC بين التطبيقات
  • تحديد نطاق ذاكرة التخزين المؤقت (الخادم/التطبيق/الجلسة/الطلب الحالي فقط)
  • استخدم مثيلات ذاكرة التخزين المؤقت المختلفة في نفس الوقت وفي نفس الطلب
  • تكون مستقلة عن مركبات الكربون الكلورية فلورية باستخدام مكون ذاكرة التخزين المؤقت
  • الالتزام بشكل عام بالفطرة السليمة (الفصل، التغليف، التعامد، القفل)

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

للقفل، أستخدم الأقفال المسماة ('CacheRead', 'CacheWrite') حاليًا ، هذا آمن ولكنه يذهلني على أنه غريب.لماذا أرغب في الحصول على قفل على مستوى الخادم، على سبيل المثال، لعملية الجلسة فقط؟(نعم، ربما هذا يكون أكاديمي، ولكن على أي حال.)

يبدو أيضًا أن تمرير نطاق التطبيق كمرجع عندما أريد التخزين المؤقت على مستوى التطبيق هو الشيء الخطأ الذي يجب فعله.هل هناك طريقة أفضل؟

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

المحلول

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

ذاكرة التخزين المؤقت.cfc:

<cfcomponent>
    <cfset variables.cacheScope = "session" /><!--- default to session --->
    <cfset variables.cache = ""/>

    <cfscript>
    function init(scope){
        variables.cacheScope = arguments.scope;
        return this;
    }

    function cacheWrite(key, value){
        structInsert(evaluate(variables.cacheScope),arguments.key,arguments.value,true);
        return this;
    }

    function cacheRead(key){
        if (not structKeyExists(evaluate(variables.cacheScope), arguments.key)){
            return "";
        }else{
            variables.cache = evaluate(variables.cacheScope);
            return variables.cache[arguments.key];
        }
    }   
    </cfscript>
</cfcomponent>

ووجهة نظر لاختباره:

<!--- clear out any existing session vars --->
<cfset structClear(session)/>
<!--- show empty session struct --->
<cfdump var="#session#" label="session vars">
<!--- create storage object --->
<cfset cacher = createObject("component", "cache").init("session")/>
<!--- store a value --->
<cfset cacher.cacheWrite("foo", "bar")/>
<!--- read stored value --->
<cfset rtn = cacher.cacheRead("foo")/>
<!--- show values --->
<cfdump var="#rtn#">
<cfdump var="#session#" label="session vars">

خارج الموضوع:أحب أن أكتب وظائف الضبط الخاصة بي لإرجاع "هذا" [كما هو موضح أعلاه] حتى أتمكن من سلسلة استدعاءات الأساليب مثل jQuery.يمكن كتابة جزء من العرض بنفس السهولة على النحو التالي:

<cfset rtn = createObject("component", "cache")
    .init("session")
    .cacheWrite("foo", "bar")
    .cacheRead("foo")/>

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

إذا كنت لا تزال منزعجًا منه (وربما على حق؟) الربيع البارد)، بهذه الطريقة، إذا قررت نقل ذاكرة التخزين المؤقت إلى نطاق آخر، فلن تضطر إلى تحرير 300 صفحة كلها باستخدام ذاكرة التخزين المؤقت CFC الخاصة بك، وتمرير "الجلسة" إلى init، وبدلاً من ذلك يمكنك تحرير 1 CFC أو تكوين ColdSpring الخاص بك.

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

نصائح أخرى

حسنًا - نظرًا لأنني أساءت فهم سؤالك في البداية، فقد قمت بحذف إجابتي السابقة حتى لا تسبب أي ارتباك إضافي.

للإجابة على سؤالك حول القفل:

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

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

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