हमारे पास एक बहुत महंगी गणना है जिसे हम कैश करना चाहते हैं। calculate($key)
दौरानकैश और कैश स्टैम्पेड से परहेज करना - एकाधिक एक साथ गणना
my $result = $cache->get($key);
unless ($result) {
$result = calculate($key);
$cache->set($key, $result, '10 minutes');
}
return $result;
अब
,, इससे पहले कि हम कैश में परिणाम की दुकान, कई अन्य अनुरोधों में आते हैं, वह भी calculate($key)
आरंभ हो जाएंगे, और प्रणाली के प्रदर्शन ग्रस्त है क्योंकि कई प्रक्रियाओं सभी गणना कर रहे हैं: तो हम के लिए इसी तरह कुछ करना वही चीज़।
आइडिया: आइए कैश में एक ध्वज डालें, जिस पर मूल्य की गणना की जा रही है, इसलिए अन्य अनुरोध सिर्फ उस गणना की समाप्ति के लिए प्रतीक्षा करते हैं, इसलिए वे सभी इसका उपयोग करते हैं। कुछ ऐसा:
my $result = $cache->get($key);
if ($result) {
while ($result =~ /Wait, \d+ is running calculate../) {
sleep 0.5;
$result = $cache->get($key);
}
} else {
$cache->set($key, "Wait, $$ is running calculate()", '10 minutes');
$result = calculate($key);
$cache->set($key, $result, '10 minutes');
}
return $result;
अब यह कीड़े का एक नया नया खुलता है। यदि कैश सेट करने से पहले $$ मर जाता है तो क्या होगा। क्या होगा अगर, क्या हुआ अगर ... वे सब के सब व्याख्या करने योग्य है, लेकिन बाद से वहाँ CPAN में कुछ भी नहीं है कि करता है यह, मैं सोच शुरू (वहाँ CPAN में कुछ सब कुछ के लिए है) है:
वहाँ एक बेहतर दृष्टिकोण है? क्या कोई विशेष कारण है उदा। पर्ल का Cache
और Cache::Cache
कक्षाएं इस तरह कुछ तंत्र प्रदान नहीं करती हैं? क्या कोई कोशिश की गई और सही पैटर्न है जिसका मैं उपयोग कर सकता हूं?
आदर्श पहले से ही निचोड़ में एक Debian पैकेज या एक यूरेका पल, जहां मैं अपने तरीके से त्रुटि देख के साथ एक CPAN मॉड्यूल होगा ... :-)
संपादित करें: मैं के बाद से सीखा है कि यह कहा जाता है एक Cache stampede और प्रश्न के शीर्षक को अद्यतन किया है।
[आईपीसी :: ShareLite] (http://search.cpan.org/~andya/IPC-ShareLite-0.17/lib/IPC/ShareLite.pm) SysV के लिए OO इंटरफेस प्रदान करता है शेयर्ड मेमोरी। इसकी तरह ** कैश ** के समान है जो एक विशेष लॉक प्रदान करता है। – tuxuday
एक [कैश स्टैम्पेड - विकिपीडिया लेख] (https://en.wikipedia.org/wiki/Cache_stampede) है और एक [पर्ल-कैश चर्चा> मुद्रित विषय से परहेज] [https://groups.google.com/d/विषय/perl-cache-चर्चा/jDdBQliwlP4/चर्चा) इसके लिए रणनीतियों के बारे में। –
और वहां एक [djangosnippets: MintCache] (https://www.djangosnippets.org/snippets/155/) रणनीति है। –