用memcached做即時分頁緩衝

來源:互聯網
上載者:User

用memcached做分頁緩衝,可能很多人會覺得麻煩而不用。因為在增加、修改、刪除的過程中,你不知道會影響到哪些資料,而如果把所有分頁相關的資料緩衝都刪除並重建一遍,實現又很麻煩,甚至不可行,所以乾脆就用mysql直接分頁,簡單方便,但是這樣效能卻也下降了。 本章就講一個簡單的實現用memcached做分頁緩衝的方法。

首先假使我們有一個文章頁需要做分頁顯示,分頁類型有按分類分頁,按最新分頁,按熱點分頁,按自訂方式分頁,等等。這就出現了一個比較棘手的問題,我們對資料的更新影響到哪些分頁我們是不可知的,不知道需要刪除哪些相關的緩衝。你可能會想,更新資料時刪除所有類型分頁的緩衝不就好了。那我問你,有多少種分頁類型,每個類型各有多少頁,key的組成方式各是什麼,如果分頁帶有其他get查詢參數,你怎麼知道get都傳遞了哪些值,不知道這些,你怎麼刪除全部分頁緩衝。

講到這裡,你可能會覺得有點失望吧,不是嗎,沒想到用memcached做分頁緩衝原來這麼麻煩。那麼,有沒有簡單的解決方案?答案是肯定的,請相信,我寫這篇文章的目的,就是來告訴你一個簡單的解決方案來的。說了這麼多,其實我們需要解決的核心問題就只有一個,我們增加、修改、刪除文章資料時,能夠讓分頁的緩衝都失效。解決方案也很簡單,我們只需要引入版本號碼就可以了,在所有受影響的memcached的key中都加入版本號碼,當我們增加、修改、刪除文章資料時,版本號碼+1,這樣就等於所有分頁相關的緩衝都失效了。

實現代碼如下: 

 
  1. <?php 
  2. //備忘:假使下面函數都已經已經初始化$memcached了 
  3. class Article 
  4.     private $article_version = 'article_version'; 
  5.      
  6.     public function getArticle($type='new',$page='1',$limit=0){      
  7.         //設定memcached的key,在key的末端加上版本號碼 
  8.         $cache_id = 'art_type'.$type.'_page'.$page.'_limit'.$limit.'v_'.$this->_getArticleVersion();         
  9.         //得到分頁資料 
  10.         $artdata = $memcached->get($cache_id); 
  11.         if( FALSE === $artdata) { 
  12.             //重新從資料庫得到資料並設定新的memcached緩衝     
  13.         } 
  14.         return $artdata; 
  15.     } 
  16.      
  17.     public function updateArticle($conditions,$data){ 
  18.         //更新資料庫資料操作 
  19.          
  20.         //更新Article的版本,這樣所有Article表相關的緩衝就都失效了,下次調用getArticle函數的時候將產生新的快取資料 
  21.         $this->_setArticleVersion(); 
  22.     } 
  23.      
  24.     private function _getArticleVersion(){ 
  25.         $article_version_num = $memcached->get($this->article_version); 
  26.         if( FALSE === $article_version_num){ 
  27.             $article_version_num = 1; 
  28.             $memcached->set($this->article_version, $article_version_num, 86400); 
  29.         } 
  30.         return $article_version_num; 
  31.     } 
  32.      
  33.     private function _setArticleVersion(){ 
  34.         $article_version_num = $memcached->get($this->article_version); 
  35.         $article_version_num++; 
  36.         $memcached->set($this->article_version, $article_version_num, 86400); 
  37.     } 
  38.  
  39. ?> 

是不是很簡單?也就是比平常的memcached緩衝多了兩個函數_ getArticleVersion()和_ setArticleVersion(),這樣當我們有增加、修改、刪除文章的時候,就調用_ setArticleVersion()函數,使版本號碼+1,也就是之前版本的資料都失效了,由於在獲得文章分頁快取資料時key都有加入_ getArticleVersion(),所以得不到新版本號碼的快取資料,就從資料庫查到,然後產生新版本的緩衝,舊的緩衝在時間到期之後會自動釋放記憶體空間。

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.