Spring Boot / المتوسط: البيانات والأمان وأدلة الإطار / الدرس 11
مفاتيح التخزين المؤقت واتساقه
حدد ما يعاد استخدامه ولمن وكم يدوم قبل اختيار وسوم التخزين المؤقت أوموفره.
في هذه الصفحة
أهداف الدرس
- اختيار مفتاح كامل وملكية نتيجة آمنة.
- شرح حد الحجم والانتهاء الخاص بالموفر.
- تنسيق الإبطال مع المعاملة والأمان.
يغير المخبأ عقد حداثة البيانات
يعيد المخبأ نتيجة بمفتاح بدلاً من الدالة كل مرة. حدد التقادم المقبول والنطاق والإبطال والذاكرة والفشل أولاً. لا يثبت ارتفاع الإصابة أمان النتيجة لكل مستخدم، ولا تخزن قرار تفويض حساساً أوبيانات شخصية بمفتاح يهمل الهوية والسياسة.
قد تضبط Boot البنية عند التمكين وتوفر الموفر، ولا تبتكر الواجهة TTL عامة أو قفلاً موزعاً أو معاملة ذرية للقاعدة والمخبأ. تختلف خريطة متزامنة بسيطة من Caffeine أوالبعيد. ثبت عقد الموفر واختبره بدلاً من افتراض أن annotations تمحو الفروق.
صرح بالأبعاد التي تغير النتيجة
يمكّن الجزء التخزين في تهيئة منفصلة ويضم المستأجر والمنتج واللغة بمراجع معاملات موضعية، فلا يدعي أن المعرف وحده يحدد كل تمثيل. يحتاج CacheManager وقدرة بحث سياقية ولم ينفذ. يجب اشتقاق المستأجر أوفحصه بتفويض موثوق.
تحتاج النصيحة في نمط الوكيل عبوراً مُداراً؛ وقد يتجاوزها النداء الذاتي. تتخطى الإصابة تنفيذ الدالة، فلا تضع فحص الحق الأساسي داخل العمل المتجاوز وحده. طابق قرار الوصول وإعادة النتيجة بقصد، بما فيه سحب الإذن وتغير الحقول المرئية للمستخدم.
package training.catalog;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
@Configuration(proxyBeanMethods = false)
@EnableCaching
class ProductCacheConfiguration {}
@Service
class ProductCacheService {
private final ProductQuery products;
ProductCacheService(ProductQuery products) { this.products = products; }
@Cacheable(cacheNames="productSummaries", key="{#p0,#p1,#p2}")
public ProductSummary load(String tenantId, long productId, String language) {
return products.read(tenantId, productId, language);
}
}
يشمل المفتاح الأبعاد الثلاثة، ولم ينفذ الموفر أوالاعتراض أوالتفويض أوالإبطال.
افحص فصل المفاتيح دون ادعاء سلوك الموفر
يظهر نموذج record أن المنتج نفسه لمستأجر أو لغة أخرى مفتاح مختلف، وتثبت القيم الثلاث عقد المساواة المصطنع. ليس اختبار Spring أوانتهاء أوحق الطالب في سلسلة المستأجر؛ يبقى النطاق المختار عدائياً غير آمن رغم صحة فصل المفتاح.
للنتيجة ملكية أيضاً؛ فقد تسمح قائمة متغيرة أوكيان مُدار بتأثير مستدعٍ في آخر أوحبس حالة الاستمرارية. فضّل نتيجة ثابتة معتمدة أو نسخة دفاعية حيث يلزم. ولتخزين الغياب سياسة حتى لا يخفي إنشاءً لاحقاً أطول مما يقصده المنتج.
public class Main {
record Key(String tenant,long product,String language) {}
public static void main(String[] args) throws Exception {
var cache=java.util.Map.of(new Key("north",42,"en"),"North view");
System.out.println(cache.containsKey(new Key("north",42,"en")));
System.out.println(cache.containsKey(new Key("south",42,"en")));
System.out.println(cache.containsKey(new Key("north",42,"ar")));
}
}
true
false
false
يطابق المفتاح الكامل نفسه فقط دون موفر أو TTL أووكيل أوآلية تفويض.
طابق الإبطال بالتغيير المثبت فعلاً
لا يعني الإبطال بعد الدالة أنه جاء بعد commit؛ تهم أسبقية النصائح والفشل والموفر. قد ينسق مغلف واعٍ بالمعاملة أوعمل after-commit عمليات مختارة، ولا يجعل القاعدة والمخبأ الموزع مورداً ذرياً واحداً. اختبر التراجع وفشل التثبيت مع النجاح.
حدد المفاتيح والنسخ الأخرى وفشل رسالة الإبطال. لا تفرغ الجميع علاجاً عادياً لقيمة واحدة، ولا تفترض أن sync أوتنسيق العملية قفل عنقود. تحتاج عاصفة الفقد والانتهاء عملاً محدوداً وقياساً يراعي الموفر الفعلي.
قس الفائدة وعواقب التقادم
اختبر التصادم والنطاق واللغة والتغير والغياب والإبطال والتراجع والانتهاء والسعة وفشل المصدر. لا يثبت mock تسلسل موفر بعيد أوتوزيعه. قس الإصابة والفقد والتأخر بأحمال متكافئة وأبق الصحة والمنع رغم نسبة إصابة ممتازة.
لا تبدأ خدمة مخبأ هنا، وتبقى إعداداتها توضيحية حتى اختبار مخول. يفيد المخبأ إذا قلل عملاً مقاساً واحترم التقادم والأمان المعلنين. إن لم يفسر أحد متى تحدث النتيجة ومن يعيدها، فقد أخفت Cacheable مشكلة تصميم بدلاً من حل الأداء.
الأخطاء الشائعة وإصلاحها
تلقى مستأجر DTO لآخر.
- لماذا يحدث؟
- أهمل المفتاح أوالإذن النطاق.
- كيف تصلحه؟
- أصلح الوصول وأكمل الأبعاد.
- كيف تتجنب تكراره؟
- اختبر معرفاً صحيحاً لمستأجر آخر.
لم تنته مدخلات مخبأ بسيط.
- لماذا يحدث؟
- افتُرض TTL وحد حجم تلقائي.
- كيف تصلحه؟
- اختر حدود الموفر وتحقق منها.
- كيف تتجنب تكراره؟
- وثق العمر والذاكرة.
ترك التراجع قيمة مخبأة مضللة.
- لماذا يحدث؟
- لم تنسق القاعدة والمخبأ.
- كيف تصلحه؟
- اختر سياسة واعية واختبر الفشل.
- كيف تتجنب تكراره؟
- اختبر رفض التثبيت والتراجع.
اختبر فهمك
1. لماذا لا يكفي 42 لمفتاح ملخص مترجم محلي؟
اعرض الحل المشروح
قد يخص بيانات مستأجر أوتمثيل لغة آخر. ضم الأبعاد وافرض النطاق مستقلاً؛ فلا يفوض المفتاح اختيار مستأجر آخر.
2. هل يثبت load المباشر اعتراض Cacheable؟
اعرض الحل المشروح
لا؛ يفحص الدالة. يلزم وكيل وموفر ومفتاح ودليل إصابة وإبطال، وقد يتجاوز new أوالنداء الذاتي النصيحة مع DTO تبدو صحيحة.
أهم ما تعلمته
- المخبأ عقد نطاق وحداثة وملكية.
- لا تعطي annotations سلوك موفر عاماً.
- تبقى المعاملة والتفويض لازمين في مسار المخبأ.