您好,登錄后才能下訂單哦!
這篇文章主要介紹“PHP緩存穿透及使用Redis進(jìn)行緩存加鎖的方法”,在日常操作中,相信很多人在PHP緩存穿透及使用Redis進(jìn)行緩存加鎖的方法問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”PHP緩存穿透及使用Redis進(jìn)行緩存加鎖的方法”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
緩存穿透指的是,當(dāng)我們?cè)L問某個(gè)緩存KEY想取得對(duì)應(yīng)的數(shù)據(jù)時(shí),若此KEY不存在于緩存中,則會(huì)去查庫。如何解決呢?將每次查詢的結(jié)果都放入緩存不管是不是空。
public function getArticles($key){$expire = 60 * 3;$data = Cache::get($key);//注意:此處使用is_null來判斷而不是直接使用 (!$data)來判斷。 //使用 (!$data)來判斷的弊端是:如果$data的值為空字符串或者空數(shù)組,此處也是不成立的,會(huì)繼續(xù)執(zhí)行查詢DB的語句,造成緩存穿透 if (!is_null($data)) {return $data;}$data = $this->searchDB();Cache::put($key, $data, $expire);return $data;}
這樣處理的原因是,即使當(dāng)前查詢的key為空字符串,或者空數(shù)組,結(jié)果也會(huì)被緩存起來。當(dāng)下一次訪問時(shí)會(huì)直接返回,不會(huì)造成緩存穿透
若系統(tǒng)的并發(fā)很高,當(dāng)緩存過期時(shí),則大量的請(qǐng)求會(huì)穿透緩存,同時(shí)到DB中查詢,那我們可以設(shè)置緩存當(dāng)緩存過期時(shí),只去DB中請(qǐng)求一次并緩存嗎?可以,我們可以使用redis的setNx()
setNx($key) 的作用類似于set($key) ,setNx的意思為 set Not Exists 如果$key不存在則設(shè)置,存在則不進(jìn)行任何操作. 設(shè)置成功設(shè)置返回1,說明當(dāng)前的請(qǐng)求獲得了當(dāng)前的操作權(quán)限,設(shè)置失敗返回0,說明此資源已經(jīng)被其他請(qǐng)求獲得。
使用代碼實(shí)現(xiàn)的話,思路如下:
給存入緩存的數(shù)據(jù)增加一個(gè)過期時(shí)間字段暫時(shí)給這個(gè)字段起名字叫$data['expire'](這個(gè)過期時(shí)間要短于實(shí)際的緩存過期時(shí)間),方便在緩存過期前執(zhí)行加鎖和緩存更新。
如果$data['expire']達(dá)到過期時(shí)間,則執(zhí)行加鎖以及緩存更新。
此時(shí)如果有其他請(qǐng)求進(jìn)入則返回更新之前的數(shù)據(jù)。
代碼如下:
public function getArticlesLock($key){$time = time();$expire = 10 * 2;$lockKey = 'lock:k';$data = Cache::get($key);if (!is_null($data)) {//緩存未過期 if ($data['expire'] > time()){return $data['data'];}//加鎖失敗說明已經(jīng)有請(qǐng)求執(zhí)行加鎖,返回之前的緩存數(shù)據(jù) if (!Redis::setnx($lockKey,1)) {return $data['data'];}}sleep(3);$datat = $this->searchDB();$data = ['data' => $datat,'expire' => $time + $expire - 10];$r = Cache::put($key, $data, $expire);//解鎖 Redis::del($lockKey);return $data['data'];}
當(dāng)然此處也可以使用set()
來代替setnx()
加鎖,以及使用lua腳本解鎖。
到此,關(guān)于“PHP緩存穿透及使用Redis進(jìn)行緩存加鎖的方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。