လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> apcu_cas function ကို အသုံးပြု. cache race အခြေအနေများကိုရှောင်ရှားရန်

apcu_cas function ကို အသုံးပြု. cache race အခြေအနေများကိုရှောင်ရှားရန်

gitbox 2025-05-29

cache race အခြေအနေများကဘာတွေလဲ။

လုပ်ငန်းစဉ်များသို့မဟုတ်ချည်များက cache ကိုလွဲချော်ရန်နှင့်တစ်ချိန်တည်းတွင် cache ကိုဖတ်ရန်ကြိုးစားသောအခါ, တစ်ချိန်တည်းတွင် cache ကိုရေးရန်လုပ်ငန်းစဉ်များစွာသည်တူညီသောနှေးကွေးသောစုံစမ်းမှုသို့မဟုတ်ရှုပ်ထွေးသောတွက်ချက်မှုများကိုတစ်ချိန်တည်းတွင်ပြုလုပ်နိုင်သည်။ ဤအခြေအနေကို cache cache race အခြေအနေဟုခေါ်သည်။

ဥပမာအားဖြင့်:

 if (!apcu_exists('my_cache_key')) {
    $data = get_data_from_db(); // ရှုပ်ထွေးသောစုံစမ်းမှု
    apcu_store('my_cache_key', $data);
}
echo apcu_fetch('my_cache_key');

တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်တည်းပတ်ဝန်းကျင်တွင် cache သည်တစ်ချိန်တည်းတွင်မတည်ရှိနိုင်ကြောင်းတောင်းဆိုမှုများသည်တစ်ချိန်တည်းတွင်တည်ရှိပြီးဒေတာဘေ့စ်မေးမြန်းချက်များကိုတစ်ချိန်တည်းတွင်လုပ်ဆောင်လိမ့်မည်။


apcu_cas function ကိုမိတ်ဆက်ခြင်း

apcu_cas ၏အမည်အပြည့်အစုံသည် cover account swap ကိုနှိုင်းယှဉ်ခြင်းနှင့် Swap "ဖြစ်သည်။ ဤစစ်ဆင်ရေးသည် cache ကိုတစ်ပြိုင်နက်တည်းပြုပြင်ရန်တောင်းဆိုမှုများစွာကြောင့်ဖြစ်ပေါ်လာသောပြိုင်ဆိုင်မှုပြ problem နာကိုရှောင်ရှားနိုင်သည်။

function ရှေ့ပြေးပုံစံ:

 bool apcu_cas(string $key, mixed $old, mixed $new)
  • $ key : cache key

  • $ ဟောင်း : မျှော်လင့်ထားသည့်အဟောင်းတန်ဖိုး

  • $ အသစ် - အစားထိုးရန်တန်ဖိုးအသစ်

  • True True True ဆိုသည်မှာအစားထိုးခြင်းသည်အောင်မြင်သည်, မှားယွင်းသော နည်းလမ်းသည်တန်ဖိုးဟောင်းသည်မကိုက်ညီသောကြောင့်အစားထိုးခြင်းသည်မကိုက်ညီသောကြောင့်မအောင်မြင်ပါ။


ပြိုင်ပွဲအခြေအနေကိုရှောင်ရှားရန် apcu_cas ကိုမည်သို့အသုံးပြုရမည်နည်း။

ကျွန်ုပ်တို့သည် "သော့ခတ်" အလံကိုသတ်မှတ်ခြင်းဖြင့် Mutex access cache ကိုအကောင်အထည်ဖော်သည်။ တိကျတဲ့စိတ်ကူးများ:

  1. cache ကိုဖတ်ပြီးတည်ရှိပါကတိုက်ရိုက်ပြန်လာပါ။

  2. cache မတည်ရှိပါက cache ကိုထုတ်လုပ်သည်ကိုညွှန်ပြရန် "သော့ခတ်" အလံကိုရေးရန်ကြိုးစားပါ။

  3. "Lock" ကို setting မအောင်မြင်ပါကအခြားဖြစ်စဉ်များသည် cache ကိုထုတ်လုပ်နေပြီး,

  4. ချိန်ညှိမှုအောင်မြင်ပြီးနောက်ဒေတာထုတ်လုပ်ရန်နှေးကွေးသောစုံစမ်းမှုကိုလုပ်ဆောင်ပါ။

  5. ဒေတာများကို cache သို့ရေးပြီး "Lock" အလံကိုလွှတ်လိုက်ပါ။

  6. ဒေတာကိုပြန်သွားပါ။


နမူနာကုဒ်သရုပ်ပြ

 function getCacheData() {
    $cacheKey = 'my_cache_key';
    $lockKey = 'my_cache_key_lock';

    // 1. ပထမ ဦး ဆုံး cache ကိုဖတ်ရန်ကြိုးစားပါ
    $data = apcu_fetch($cacheKey, $success);
    if ($success) {
        return $data;
    }

    // 2. သွားဖို့ကြိုးစားပါapcu_casသော့ခတ်ထားပါ,တောင်းဆိုမှုများကိုတစ်ပြိုင်နက်တည်း cache များကိုထုတ်လုပ်ခြင်းမှတားဆီးခြင်းကိုတားဆီးပါ
    // 先尝试သော့ခတ်ထားပါ标志位为false(ကန ဦး အခြေအနေ)
    apcu_add($lockKey, false);

    // မျှော်လင့်ထားသည့်သော့ခတ်သည်false,ပြောင်းလဲရန်ကြိုးစားပါtrue(သော့ခတ်)
    if (!apcu_cas($lockKey, false, true)) {
        // အခြားတောင်းဆိုမှုများကိုသော့ခတ်ထားကြောင်းဖော်ပြသည်,cache မျိုးဆက်ကိုစောင့်ပါ
        // ရိုးရှင်းနိုင်ပါတယ်sleepသို့မဟုတ်ကွင်းဆက်အတွက်စောင့်ပါ
        usleep(100000); // စောင့်100မီလီစက္ကန့်
        return getCacheData(); // ပြန်လည်ထူထောင်ရေးကြိုးစားပါ
    }

    // 3. သော့ခတ်ရယူပါ,နှေးနှေးစုံစမ်းမှု execute
    $data = get_data_from_db();

    // 4. cache ရေးပါ
    apcu_store($cacheKey, $data);

    // 5. သော့ခတ်ကိုလွှတ်လိုက်ပါ(သော့ခတ်ထားပါ为false)
    apcu_store($lockKey, false);

    return $data;
}

function get_data_from_db() {
    // နှေးကွေးသောစုံစမ်းမှုကိုတုပပါ
    sleep(1);
    return ['time' => time(), 'data' => 'sample'];
}

အထက်ပါကုဒ်တွင် Apcu_cas သည် "Lock" ၏အက်တမ် switching ကိုသေချာစေသည်။


အကျဉ်းချုပ်

  • Cache ပြိုင်ပွဲအခြေအနေများသည်တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်တည်း cacheging အခြေအနေများတွင်ဘုံပြ problem နာဖြစ်သည်။

  • Apcu_cas သည်အက်တမ်စစ်ဆင်ရေးများကိုအကောင်အထည်ဖော်ရန်အတွက်အစွမ်းထက်သောကိရိယာတစ်ခုဖြစ်သည်။

  • "Lock" ယန္တရားမှတဆင့်တောင်းဆိုမှုတစ်ခုသာလျှင်နှေးကွေးသောစုံစမ်းမှုကိုသာလုပ်ဆောင်နိုင်ပြီး cache ကိုရေးနိုင်ပြီးအခြားတောင်းဆိုမှုများသည်စောင့်ဆိုင်းနိုင်သည်သို့မဟုတ်ထပ်မံကြိုးစားနိုင်သည်။

  • ဤနည်းလမ်းသည် apcu cache ကို stand-somety enform ည့်သည်များအတွက်သင့်တော်သည်။

APCU_CAS အသုံးပြုခြင်းကိုကျွမ်းကျင်မှုသည်သင်၏ PHP cache ယန္တရားကိုပိုမိုခိုင်မာစေပြီးထိရောက်စေရန်,


<code> <? PHP function getcachedata () {$ cacekey = 'my_cache_key'; $ lockkey = 'my_cache_key_lock';
 $data = apcu_fetch($cacheKey, $success);
if ($success) {
    return $data;
}

apcu_add($lockKey, false);

if (!apcu_cas($lockKey, false, true)) {
    usleep(100000);
    return getCacheData();
}

$data = get_data_from_db();

apcu_store($cacheKey, $data);

apcu_store($lockKey, false);

return $data;

}

function get_data_from_db () {)
အိပ် (1),
ပြန်သွားပါ ['အချိန်' => အချိန် (), 'ဒေတာ' => 'နမူနာ'];
}
>
</ code>