麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > PHP > 正文

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

2024-05-04 23:43:21
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP使用Memcache時模擬命名空間及緩存失效問題的解決,這里談到的緩存失效主要針對高并發場景下取不到緩存的情況,需要的朋友可以參考下
 

緩存命名空間

memcache本身不支持命名空間,但是我們可以利用 memcache本身的機制,來模擬命名空間。比如:你要清除一組數據,就需要用到命名空間,來看這樣一個例子,說明寫在了注釋里:

class Action{   public function index() {  global $mc_wr;     // 獲取命名空間  $ns_key = $mc_wr->get("foo_namespace_key");  // 如果命名空間不存在,則設置一個  if($ns_key===false) $mc_wr->set("foo_namespace_key",time());     $otherParms = 'select * from user LIMIT 1';  // 根據命名空間生成唯一的key  $my_key = "foo_".$ns_key.'_'.md5($otherParms);     // 獲取當前key下的緩存  $val = $mc_wr->get($my_key);  if (!$val) {   $value = 'wangdekang_'.time();   // 緩存不存在則設置緩存 600秒, 0為隨機失效時間, 為失效時間添加隨機秒數,防止瞬間所有緩存同時失效   $mc_wr->set($my_key,$value,600, 0);  }     echo $val; }   public function clear_ns() {  global $mc_wr;  // 更新命名空間值,讓當前命名空間的所有值失效, memcache自身的緩存失效機制,當緩存不在被訪問,會通過LRU失效機制  $mc_wr->set('foo_namespace_key', time()); }}

memcache緩存失效問題
在大并發的場合,當cache失效時,大量并發同時取不到cache,會同一瞬間去訪問db并回設cache,可能會給系統帶來潛在的超負荷風險。
解決方法:

方法一 
在load db之前先add一個mutex key, mutex key add成功之后再去做加載db, 如果add失敗則sleep之后重試讀取原cache數據。為了防止死鎖,mutex key也需要設置過期時間。偽代碼如下 

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內部設置1個超時值(timeout1), timeout1比實際的memcache 
timeout(timeout2)小。當從cache讀取到timeout1發現它已經過期時候,馬上延長timeout1并重新設置到cache。然
后再從數據庫加載數據并設置到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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 免费一级特黄做受大片 | 男女生羞羞视频网站在线观看 | 久久草在线视频国产 | 永久免费黄色大片 | 亚洲视频成人 | 91看片淫黄大片欧美看国产片 | 色婷婷久久久亚洲一区二区三区 | 亚洲影视在线 | 在线播放中文 | 99re热精品视频 | 国产精品自拍av | 国产精品久久久久久久av三级 | 亚洲最大中文字幕 | h视频在线免费看 | 99影视电影电视剧在线播放 | 免费特黄 | 女人叉开腿让男人桶 | 99精品国产一区二区三区 | av在线免费看片 | 久久精品欧美一区二区 | 精品一区二区久久久久久按摩 | 日日爱影院| 精品一区二区三区日本 | 国产成人av免费 | 成人午夜免费福利 | 成人三级免费电影 | 精品一区二区三区中文字幕 | caoporn国产一区二区 | 男女羞羞视频在线免费观看 | 97久久人人超碰caoprom | 蜜桃网在线 | 亚洲精久久 | 666sao| 成人午夜免费国产 | 福利在线小视频 | 中国黄色一级生活片 | 亚洲第一激情 | 色淫视频 | 免费日韩片 | 成人综合一区二区 | 精品国产一区二区三区久久久狼牙 |