91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP緩存穿透及使用Redis進行緩存加鎖的方法

發布時間:2021-07-05 17:28:48 來源:億速云 閱讀:321 作者:chen 欄目:編程語言

這篇文章主要介紹“PHP緩存穿透及使用Redis進行緩存加鎖的方法”,在日常操作中,相信很多人在PHP緩存穿透及使用Redis進行緩存加鎖的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP緩存穿透及使用Redis進行緩存加鎖的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一 緩存穿透

緩存穿透指的是,當我們訪問某個緩存KEY想取得對應的數據時,若此KEY不存在于緩存中,則會去查庫。如何解決呢?將每次查詢的結果都放入緩存不管是不是空。

public function getArticles($key){$expire = 60 * 3;$data = Cache::get($key);//注意:此處使用is_null來判斷而不是直接使用 (!$data)來判斷。    //使用 (!$data)來判斷的弊端是:如果$data的值為空字符串或者空數組,此處也是不成立的,會繼續執行查詢DB的語句,造成緩存穿透    if (!is_null($data)) {return $data;}$data = $this->searchDB();Cache::put($key, $data, $expire);return $data;}

這樣處理的原因是,即使當前查詢的key為空字符串,或者空數組,結果也會被緩存起來。當下一次訪問時會直接返回,不會造成緩存穿透

二 緩存加鎖(Redis)

若系統的并發很高,當緩存過期時,則大量的請求會穿透緩存,同時到DB中查詢,那我們可以設置緩存當緩存過期時,只去DB中請求一次并緩存嗎?可以,我們可以使用redis的setNx()
setNx($key) 的作用類似于set($key) ,setNx的意思為 set Not Exists 如果$key不存在則設置,存在則不進行任何操作. 設置成功設置返回1,說明當前的請求獲得了當前的操作權限,設置失敗返回0,說明此資源已經被其他請求獲得。使用代碼實現的話,思路如下:

  1. 給存入緩存的數據增加一個過期時間字段暫時給這個字段起名字叫$data['expire'](這個過期時間要短于實際的緩存過期時間),方便在緩存過期前執行加鎖和緩存更新。

  2. 如果$data['expire']達到過期時間,則執行加鎖以及緩存更新。

  3. 此時如果有其他請求進入則返回更新之前的數據。

代碼如下:

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'];}//加鎖失敗說明已經有請求執行加鎖,返回之前的緩存數據        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'];}

當然此處也可以使用set()來代替setnx()加鎖,以及使用lua腳本解鎖。

到此,關于“PHP緩存穿透及使用Redis進行緩存加鎖的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

香河县| 射洪县| 会宁县| 洛阳市| 广安市| 岑溪市| 巴彦淖尔市| 科技| 拉萨市| 永善县| 武宁县| 宝清县| 英吉沙县| 临清市| 游戏| 开江县| 朝阳区| 梁山县| 措勤县| 汾阳市| 嘉兴市| 遂宁市| 马关县| 泸水县| 赤水市| 合川市| 巫山县| 龙岩市| 五大连池市| 镇赉县| 上虞市| 河津市| 丽江市| 兰西县| 定州市| 华容县| 沈阳市| 文山县| 虹口区| 玛曲县| 汪清县|