2009-10-22 11 views
19

हम डेटाबेस में लिखते समय मेमकैच किए गए ऑब्जेक्ट्स को अपडेट करने का प्रयास कर रहे हैं ताकि उन्हें आवेषण/अपडेट के बाद डेटाबेस से पढ़ना न पड़े।मेमकैच, लॉकिंग और रेस स्थितियां

हमारे फ़ोरम पोस्ट ऑब्जेक्ट के लिए हमारे पास एक व्यूकाउंट फ़ील्ड है जिसमें पोस्ट को कितनी बार देखा जाता है।

हमें डर है कि हम memcached ऑब्जेक्ट को अपडेट करके रेस हालत पेश कर रहे हैं, क्योंकि उसी पोस्ट को खेत में किसी अन्य सर्वर पर एक ही समय में देखा जा सकता है।

कोई भी विचार इस तरह के मुद्दों से निपटने के लिए कैसे - ऐसा लगता है कि किसी प्रकार की लॉकिंग की आवश्यकता है लेकिन इसे खेत में सर्वरों पर भरोसेमंद तरीके से कैसे किया जाए?

उत्तर

15

आप डेटा जरूरी है कि की जरूरत नहीं है अद्यतन वास्तविक समय है, और मेरे लिए देखे जाने की संख्या उनमें से एक है, तो आप एक ऑब्जेक्ट मेम्कैश में जमा हो जाती को क्षेत्र समाप्त हो रहा है जोड़ सकता है के साथ काम कर रहे हैं ।

एक बार यह समाप्ति होने के बाद, यह डेटाबेस पर वापस जायेगा और नया मान पढ़ेगा, लेकिन तब तक यह इसे अकेला छोड़ देगा।

बेशक नई पोस्ट के लिए आप इसे अधिक बार अपडेट करना चाहते हैं, लेकिन आप इसके लिए कोड कर सकते हैं।

मेमकैच केवल आपके ऑब्जेक्ट की एक प्रति को अपने उदाहरणों में से एक में संग्रहीत करता है, न कि उनमें से कई में, इसलिए मैं ऑब्जेक्ट लॉकिंग या कुछ भी नहीं जानता। डेटाबेस को संभालने के लिए यह है, न कि आपके कैश।

संपादित करें:

Memcache जब तुम हो रही है और विभिन्न सर्वरों कि आपके डेटा clobbered कर नहीं होगा से स्थापित करने कि कोई गारंटी नहीं प्रदान करता है।

मेम्कैश डॉक्स से:

  • आदेशों की एक श्रृंखला परमाणु नहीं है। यदि आप किसी आइटम के विरुद्ध 'प्राप्त' जारी करते हैं, तो डेटा पर काम करें, फिर इसे 'मेमकैड' में वापस सेट करना चाहते हैं, तो आपको उस मान पर काम करने वाली एकमात्र प्रक्रिया होने की गारंटी नहीं है। समानांतर में, आप किसी अन्य चीज़ द्वारा मूल्य सेट को ओवरराइट करना समाप्त कर सकते हैं।

दौड़ की स्थिति और पुराना डेटा को ध्यान में रखने के रूप में आप कैश डेटा के लिए आपके आवेदन डिजाइन

एक बात, दौड़ की स्थिति और सामयिक पुराना डेटा से निपटने के लिए कैसे है।

कहें कि आप अपने आवेदन में साइडबार पर प्रदर्शन के लिए नवीनतम पांच टिप्पणियां कैश करते हैं। आप तय करते हैं कि प्रति मिनट केवल डेटा को ताज़ा करने की आवश्यकता है। हालांकि, आप यह याद रखने की उपेक्षा करते हैं कि इस साइडबार डिस्प्ले को प्रति सेकंड 50 बार प्रस्तुत किया जाता है! इस प्रकार, एक बार 60 सेकंड चारों ओर घूमते हैं और कैश की समयसीमा समाप्त हो जाती है, अचानक 10+ प्रक्रियाएं उसी कैश को दोबारा चलाने के लिए समान SQL क्वेरी चला रही हैं। जब भी कैश की समयसीमा समाप्त हो जाती है, तो अचानक एसक्यूएल यातायात का विस्फोट होगा।

इससे भी बदतर, आपके पास एक ही डेटा को अपडेट करने वाली कई प्रक्रियाएं हैं, और गलत कैश से डेटिंग समाप्त होता है। फिर आपके पास पुराना, पुराने डेटा के बारे में तैरता है।

किसी को हमारे कैश को पॉप्युलेट करने या दोबारा बनाने में संभावित मुद्दों के बारे में सावधान रहना चाहिए। याद रखें कि memcached की जांच, एसक्यूएल लाने, और memcached में भंडारण की प्रक्रिया परमाणु नहीं है!

+0

समस्या यह है कि हम देखे जाने की संख्या चाहते हैं (इस मामले में, लेकिन एक ही समस्या के साथ अन्य स्थितियों देखते हैं) को लाइव अपडेट रहने के लिए - आप पोस्ट क्लिक करें, और देखे जाने की संख्या बढ़ जाती है। इसके अलावा हम कैश ऑब्जेक्ट को यथासंभव लंबे समय तक जीने के लिए, प्रदर्शन के कारणों के लिए चाहते हैं। – Micael

+1

आप इस बात की गारंटी नहीं दे सकते कि आप जिस तरीके से ऐसा करना चाहते हैं, उसमें आप क्या करना चाहते हैं। क्या memcache आपको स्केलेबिलिटी देता है, कच्चे प्रदर्शन नहीं। – Nathan

1

memcached संचालन परमाणु हैं। सर्वर प्रक्रिया अनुरोधों को कतारबद्ध करेगी और अगली बार जाने से पहले पूरी तरह से सेवा करेगी, इसलिए लॉक करने की कोई आवश्यकता नहीं है।

संपादित करें: memcached एक वेतन वृद्धि आदेश है, जो परमाणु है। आपको काउंटर को कैश में एक अलग मान के रूप में स्टोर करना होगा।

+6

सच है लेकिन मैं इस मामले में आइटम को प्राप्त कर रहा हूं, व्यूकाउंट को बढ़ा रहा हूं और इसे फिर से पंप कर रहा हूं, और जैसा कि नाथन भी कहता है, यह परमाणु ऑपरेशन नहीं है – Micael

3

मैं सोच रहा हूं - क्या एक पोस्ट पोस्ट ऑब्जेक्ट से अलग दृश्य को स्टोर करने के लिए एक समाधान हो सकता है, और उसके बाद एक आईएनसीआर करें। बेशक जानकारी प्रदर्शित करते समय इसे memcached से 2 अलग-अलग मान पढ़ने की आवश्यकता होगी।

1

हमें यह हमारे सिस्टम में सामना करना पड़ा। हम यदि मान सेट नहीं है, यह एक ध्वज ('जी') और [8] दूसरे टीटीएल के साथ सेट तो

  • मिल संशोधित, और झूठे रिटर्न तो बुला समारोह यह उत्पन्न करता है।
  • यदि मान ध्वजांकित नहीं किया गया है (! == 'g') तो इसे रद्द करें और इसे वापस करें।
  • यदि मान ध्वजांकित किया गया है (=== 'g') तो 1 सेकंड प्रतीक्षा करें और इसे फ़्लैग किए जाने तक पुनः प्रयास करें। यह अंततः दूसरी प्रक्रिया द्वारा निर्धारित किया जाएगा, या टीटीएल द्वारा समाप्त हो जाएगा।

हमारे डेटाबेस लोड को 100 के कारक द्वारा गिरा दिया गया जब हमने इसे कार्यान्वित किया।

function get($key) { 
    $value=$m->get($key); 
    if ($value===false) $m->set($key, 'g', $ttl=8); 
    else while ($value==='g') { 
    sleep(1); 
    $value=$m->get($key); 
    } 
    return $value; 
} 
+0

सेट का बेहतर उपयोग कैस() इन्सेटेड() http: // php .net/मैनुअल/आरयू/memcached.cas.php – Hett

संबंधित मुद्दे