用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(),因此得不到新版本号的缓存数据,就从数据库查到,而后生成新版本的缓存,旧的缓存在时间过时以后会自动释放内存空间。缓存

相关文章
相关标签/搜索