日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
PHP+Redis解決緩存擊穿的實(shí)際問(wèn)題

php+Redis解決實(shí)際問(wèn)題:緩存擊穿

問(wèn)題描述:

PHP+Redis如何簡(jiǎn)單避免緩存擊穿

解決方案:

get($key);

        //如果 非強(qiáng)制刷新 且 緩存非空 ,獲取鎖
        if(!$refresh && !is_null($data)){
            $lock = $redis->get($lockKey);
        }

        if(!$lock){//如果鎖過(guò)期或無(wú)數(shù)據(jù)
            $lock=$redis->setnx($lockKey,1);    //僅當(dāng)鎖不存在時(shí)設(shè)置鎖,值1代表數(shù)據(jù)獲取中
            if($lock || $refresh){              //搶到新鎖 或 強(qiáng)制刷新
                try {
                    $data=$func();              //從回調(diào)函數(shù)獲取要緩存的數(shù)據(jù)

                    //有數(shù)據(jù)則寫(xiě)入緩存,沒(méi)有則刪除數(shù)據(jù)
                    if(!is_null($data)){
                        $redis->set($key,$data);
                    }else{
                        $redis->del([$key]);
                    }

                    $redis->set($lockKey,2,'ex',$expire);   //設(shè)置鎖的過(guò)期時(shí)間,值2代表數(shù)據(jù)獲取完成
                }catch (Exception $exception){
                    $redis->del([$lockKey]);                //發(fā)生異常,刪除鎖
                }
            }else{
                //如果沒(méi)有數(shù)據(jù),又沒(méi)有搶到鎖
                //30秒內(nèi)每秒判斷搶到鎖的用戶(hù)是否執(zhí)行完成,執(zhí)行完成則從緩存得到數(shù)據(jù)并返回
                $retry=0;
                do{
                    sleep(1);
                    $retry++;
                    $data = $redis->get($key);
                }while(is_null($data) && $redis->get($lockKey)==1 && $retry<30);
            }
        }

        //寫(xiě)入內(nèi)存
        if(!is_null($data)){
            $dataStatic[$key]=$data;
        }

        //返回?cái)?shù)據(jù)
        return $data;
    }

代碼解讀:

  • 數(shù)據(jù)本體永不過(guò)期

  • 設(shè)置鎖的過(guò)期時(shí)間,鎖過(guò)期則搶到鎖的用戶(hù)刷新數(shù)據(jù)

  • 未搶到鎖的用戶(hù)如果有拿到數(shù)據(jù)就直接返回(此時(shí)數(shù)據(jù)已經(jīng)是過(guò)期數(shù)據(jù),如果對(duì)數(shù)據(jù)及時(shí)性要求高的需要自己改造代碼)

  • 未搶到鎖的用戶(hù)如果沒(méi)有拿到數(shù)據(jù)則每秒判斷搶到鎖的用戶(hù)是否執(zhí)行完成

  • 鎖有極小概率變成死鎖,最好有定時(shí)任務(wù)定期處理,比如每天業(yè)務(wù)低谷期清理死鎖


當(dāng)前名稱(chēng):PHP+Redis解決緩存擊穿的實(shí)際問(wèn)題
文章源于:http://www.5511xx.com/article/dhipggh.html