国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP使用Memcache時模擬命名空間及緩存失效問題的解

2020-03-22 19:31:50
字體:
供稿:網(wǎng)友
緩存命名空間 memcache本身不支持命名空間,但是我們可以利用 memcache本身的機制,來模擬命名空間。比如:你要清除一組數(shù)據(jù),就需要用到命名空間,來看這樣一個例子,說明寫在了注釋里: html' target='_blank'>class Action public function index() global $mc_wr; // 獲取命名空間 $ns_key = $mc_wr- get("foo_namespace_key"); // 如果命名空間不存在,則設(shè)置一個 if($ns_key===false) $mc_wr- set("foo_namespace_key",time()); $otherParms = 'select * from user LIMIT 1'; // 根據(jù)命名空間生成唯一的key $my_key = "foo_".$ns_key.'_'.md5($otherParms); // 獲取當(dāng)前key下的緩存 $val = $mc_wr- get($my_key); if (!$val) { $value = 'wangdekang_'.time(); // 緩存不存在則設(shè)置緩存 600秒, 0為隨機失效時間, 為失效時間添加隨機秒數(shù),防止瞬間所有緩存同時失效 $mc_wr- set($my_key,$value,600, 0); echo $val; public function clear_ns() global $mc_wr; // 更新命名空間值,讓當(dāng)前命名空間的所有值失效, memcache自身的緩存失效機制,當(dāng)緩存不在被訪問,會通過LRU失效機制 $mc_wr- set('foo_namespace_key', time()); memcache緩存失效問題
在大并發(fā)的場合,當(dāng)cache失效時,大量并發(fā)同時取不到cache,會同一瞬間去訪問db并回設(shè)cache,可能會給系統(tǒng)帶來潛在的超負荷風(fēng)險。
解決方法: 方法一
在load db之前先add一個mutex key, mutex key add成功之后再去做加載db, 如果add失敗則sleep之后重試讀取原cache數(shù)據(jù)。為了防止死鎖,mutex key也需要設(shè)置過期時間。偽代碼如下
if (memcache.get(key) == null) { // 3 min timeout to avoid mutex holder crash if (memcache.add(key_mutex, 3 * 60 * 1000) == true) { value = db.get(key); memcache.set(key, value); memcache.delete(key_mutex); } else { sleep(50); retry(); 方法二
在value內(nèi)部設(shè)置1個超時值(timeout1), timeout1比實際的memcache
timeout(timeout2)小。當(dāng)從cache讀取到timeout1發(fā)現(xiàn)它已經(jīng)過期時候,馬上延長timeout1并重新設(shè)置到cache。然
后再從數(shù)據(jù)庫加載數(shù)據(jù)并設(shè)置到cache中。偽代碼如下 v = memcache.get(key); if (v == null) { if (memcache.add(key_mutex, 3 * 60 * 1000) == true) { value = db.get(key); memcache.set(key, value); memcache.delete(key_mutex); } else { sleep(50); retry(); } else { if (v.timeout = now()) { if (memcache.add(key_mutex, 3 * 60 * 1000) == true) { // extend the timeout for other threads v.timeout += 3 * 60 * 1000; memcache.set(key, v, KEY_TIMEOUT * 2); // load the latest value from db v = db.get(key); v.timeout = KEY_TIMEOUT; memcache.set(key, value, KEY_TIMEOUT * 2); memcache.delete(key_mutex); } else { sleep(50); retry(); PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 曲沃县| 凤城市| 洛阳市| 鄱阳县| 兴宁市| 乐清市| 房山区| 江北区| 桐庐县| 东丰县| 墨脱县| 临洮县| 蚌埠市| 闻喜县| 兴义市| 厦门市| 仪征市| 太仆寺旗| 德安县| 进贤县| 天祝| 马山县| 沛县| 酒泉市| 郯城县| 富川| 诏安县| 互助| 盘锦市| 赤峰市| 额济纳旗| 闸北区| 明溪县| 明星| 永川市| 华安县| 南康市| 隆回县| 宕昌县| 城口县| 行唐县|