PHP使用Memcache時類比命名空間及緩衝失效問題的解決,memcache命名空間_PHP教程

來源:互聯網
上載者:User

PHP使用Memcache時類比命名空間及緩衝失效問題的解決,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();  } }}

您可能感興趣的文章:

  • 在Mac OS的PHP環境下安裝配置MemCache的全過程解析
  • PHP儲存session到memcache伺服器的方法
  • 在php中設定session用memcache來儲存的方法總結
  • PHP擴充Memcache分布式部署方案
  • PHP環境中Memcache的安裝和使用
  • windows下安裝php5.2.*,php5.3.*,php5.4.*版本的memcache擴充
  • PHP實現的memcache環形隊列類執行個體
  • php中memcache 基本操作執行個體
  • 在win系統安裝配置 Memcached for PHP 5.3 圖文教程
  • php模組memcache和memcached區別分析

http://www.bkjia.com/PHPjc/1104329.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1104329.htmlTechArticlePHP使用Memcache時類比命名空間及緩衝失效問題的解決,memcache命名空間 緩衝命名空間 memcache本身不支援命名空間,但是我們可以利用 memcac...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.