कुशल में कई बार कैश में मौजूद मान को लोड करने से रोकने के लिए कैसे?गैर-कैश किए गए मान को कई बार लोड करने से कैसे रोकें?
एक ठेठ कैश उपयोग निम्नलिखित स्यूडोकोड है:
Object get(Object key) {
Object value = cache.get(key);
if (value == null) {
value = loadFromService(key);
cache.set(key,value);
}
return value;
}
समस्या: से पहले मूल्य सेवा (डाटाबेस, WebService, RemoteEJB या कुछ और) से भरी हुई है दूसरी कॉल एक ही समय में किया जा सकता , जो एक बार फिर मूल्य लोड हो जाएगा।
उदाहरण के लिए, जब मैं उपयोगकर्ता एक्स के लिए सभी आइटम कैश कर रहा हूं, और इस उपयोगकर्ता को अक्सर देखा जाता है, और कई आइटम होते हैं, तो उसके सभी आइटमों के भार को एक साथ कॉल करने की उच्च संभावना होती है, जिसके परिणामस्वरूप सर्वर पर भारी भार होता है ।
मैं get
फ़ंक्शन सिंक्रनाइज़ कर सकता हूं, लेकिन इससे अन्य खोजों को प्रतीक्षा करने के लिए मजबूर किया जाएगा, और अधिक समझ नहीं आती है। मैं प्रत्येक कुंजी के लिए नया लॉक बना सकता हूं, लेकिन मुझे नहीं पता कि जावा में यह बड़ी संख्या में ताले प्रबंधित करने का अच्छा विचार है (यह हिस्सा भाषा विशिष्ट है, कारण मैंने इसे java
के रूप में टैग किया है) ।
या कोई और तरीका है जिसका मैं उपयोग कर सकता हूं? यदि हां, तो सबसे कुशल क्या होगा?
आप इसे गंभीरता से ओवरइंक कर रहे हैं। जब तक सेवा से डेटा लोड करने का समय भयभीत रूप से लंबा नहीं होता है, यह कभी भी एक समस्या नहीं होगी। – pablochan
मेरे पास कुछ विदेशी ईजेबी कोड है जो परीक्षण वातावरण में 20 सेकंड तक ले सकता है, इसलिए मुझे डर है कि 10 या 20 समवर्ती अनुरोधों के साथ क्या होगा –