用memcached作實時分頁緩存

memcached作分頁緩存,可能不少人會以爲麻煩而不用。由於在增長、修改、刪除的過程當中,你不知道會影響到哪些數據,而若是把全部分頁相關的數據緩存都刪除並從新生成一遍,實現又很麻煩,甚至不可行,因此乾脆就用mysql直接分頁,簡單方便,可是這樣性能卻也降低了。 本章就講一個簡單的實現用memcached作分頁緩存的方法。php

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

講到這裏,你可能會以爲有點失望吧,不是嗎,沒想到用memcached作 分頁緩存原來這麼麻煩。那麼,有沒有簡單的解決方案?答案是確定的,請相信,我寫這篇文章的目的,就是來告訴你一個簡單的解決方案來的。說了這麼多,其實 咱們須要解決的核心問題就只有一個,咱們增長、修改、刪除文章數據時,可以讓分頁的緩存都失效。解決方案也很簡單,咱們只須要引入版本號就能夠了,在全部 受影響的memcachedkey中都加入版本號,當咱們增長、修改、刪除文章數據時,版本號+1,這樣就等於全部分頁相關的緩存都失效了。sql

實現代碼以下: 數據庫

<?php //備註:假使下面函數都已經已經初始化$memcached了 class Article {     private $article_version = 'article_version';          public function getArticle($type='new',$page='1',$limit=0){              //設置memcached的key,在key的末端加上版本號         $cache_id = 'art_type'.$type.'_page'.$page.'_limit'.$limit.'v_'.$this->_getArticleVersion();                 //獲得分頁數據         $artdata = $memcached->get($cache_id);         if( FALSE === $artdata) {             //從新從數據庫獲得數據並設置新的memcached緩存             }         return $artdata;     }          public function updateArticle($conditions,$data){         //更新數據庫數據操做                  //更新Article的版本,這樣全部Article表相關的緩存就都失效了,下次調用getArticle函數的時候將生成新的緩存數據         $this->_setArticleVersion();     }          private function _getArticleVersion(){         $article_version_num = $memcached->get($this->article_version);         if( FALSE === $article_version_num){             $article_version_num = 1;             $memcached->set($this->article_version, $article_version_num, 86400);         }         return $article_version_num;     }          private function _setArticleVersion(){         $article_version_num = $memcached->get($this->article_version);         $article_version_num++;         $memcached->set($this->article_version, $article_version_num, 86400);     }  } ?>

是否是很簡單?也就是比日常的memcached緩存多了兩個函數_ getArticleVersion()_ setArticleVersion(),這樣當咱們有增長、修改、刪除文章的時候,就調用_ setArticleVersion()函數,使版本號+1,也就是以前版本的數據都失效了,因爲在得到文章分頁緩存數據時key都有加入_ getArticleVersion(),因此得不到新版本號的緩存數據,就從數據庫查到,而後生成新版本的緩存,舊的緩存在時間過時以後會自動釋放內存空間。緩存

相關文章
相關標籤/搜索