cas

(कार्यवाही Workerman संस्करण >= 3.3.0)

bool \GlobalData\Client::cas(string $key, mixed $old_value, mixed $new_value)

परमाणु प्रतिस्थापन, $new_value को $old_value से प्रतिस्थापित करता है।
केवल तभी मूल्य लिखा जा सकता है, जब वर्तमान क्लाइंट द्वारा अंतिम बार प्राप्त मान के बाद, उस की के लिए संबंधित मान को अन्य क्लाइंट द्वारा संशोधित नहीं किया गया हो।

पैरामीटर

$key

कुंजी मान। (उदाहरण के लिए $global->abc में, abc कुंजी मान है)

$old_value

पुराना डेटा

$new_value

नया डेटा

रिटर्न मान

प्रतिस्थापन सफल होने पर true लौटाता है, अन्यथा false।

विवरण:

कई प्रक्रियाएँ एक ही साझा चर को एक साथ संचालित करते समय, कभी-कभी समतुल्यता समस्याओं पर विचार करना पड़ता है।

उदाहरण के लिए, A और B दो प्रक्रियाएँ एक साथ उपयोगकर्ता सूची में एक सदस्य जोड़ रही हैं।
A और B प्रक्रियाओं द्वारा वर्तमान उपयोगकर्ता सूची $global->user_list = array(1,2,3) है।
A प्रक्रिया $global->user_list चर को संचालित कर रही है, एक उपयोगकर्ता 4 जोड़ रही है।
B प्रक्रिया $global->user_list चर को संचालित कर रही है, एक उपयोगकर्ता 5 जोड़ रही है।
A प्रक्रिया चर सेट करती है $global->user_list = array(1,2,3,4) सफलतापूर्वक।
B प्रक्रिया चर सेट करती है $global->user_list = array(1,2,3,5) सफलतापूर्वक।
इस समय B प्रक्रिया द्वारा सेट किया गया मान A प्रक्रिया द्वारा सेट किए गए मान को ओवरराइट करता है, जिससे डेटा हानि होती है।

उपरोक्त समस्या पढ़ने और सेट करने के दौरान एक परमाणु क्रिया नहीं होने के कारण होती है, जिससे समतुल्यता की समस्या उत्पन्न होती है।
इस प्रकार की समतुल्यता की समस्या को हल करने के लिए, cas परमाणु प्रतिस्थापन इंटरफ़ेस का उपयोग किया जा सकता है।
cas इंटरफ़ेस किसी मान को बदलने से पहले, $old_value के आधार पर पता करता है कि क्या इस मूल्य को अन्य प्रक्रियाओं द्वारा संशोधित किया गया है,
यदि संशोधित किया गया है, तो प्रतिस्थापन नहीं होता, false लौटाता है। अन्यथा true लौटाता है।
नीचे दिए गए उदाहरण को देखें।

ध्यान दें:
कुछ साझा डेटा का समवर्ती रूप से ओवरराइट होना कोई समस्या नहीं है, जैसे कि नीलामी प्रणाली में किसी नीलामी वस्तु का वर्तमान उच्चतम मूल्य, जैसे कि किसी उत्पाद का वर्तमान स्टॉक आदि।

उदाहरण

$global = new GlobalData\Client('127.0.0.1:2207');

// सूची का प्रारंभ 
$global->user_list = array(1,2,3);

// user_list में परमाणु रूप से एक मान जोड़ें
do
{
    $old_value = $new_value = $global->user_list;
    $new_value[] = 4;
}
while(!$global->cas('user_list', $old_value, $new_value));

var_export($global->user_list);