设为首页 收藏本站
查看: 1043|回复: 0

[经验分享] 用memcached做实时分页缓存

[复制链接]

尚未签到

发表于 2015-8-31 13:47:43 | 显示全部楼层 |阅读模式
  用memcached做分页缓存,可能很多人会觉得麻烦而不用。因为在增加、修改、删除的过程中,你不知道会影响到哪些数据,而如果把所有分页相关的数据缓存都删除并重新生成一遍,实现又很麻烦,甚至不可行,所以干脆就用mysql直接分页,简单方便,但是这样性能却也下降了。 本章就讲一个简单的实现用memcached做分页缓存的方法。
  首 先假使我们有一个文章页需要做分页显示,分页类型有按分类分页,按最新分页,按热点分页,按自定义方式分页,等等。这就出现了一个比较棘手的问题,我们对 数据的更新影响到哪些分页我们是不可知的,不知道需要删除哪些相关的缓存。你可能会想,更新数据时删除所有类型分页的缓存不就好了。那我问你,有多少种分 页类型,每个类型各有多少页,key的组成方式各是什么,如果分页带有其他get查询参数,你怎么知道get都传递了哪些值,不知道这些,你怎么删除全部分页缓存。
  讲到这里,你可能会觉得有点失望吧,不是吗,没想到用memcached做 分页缓存原来这么麻烦。那么,有没有简单的解决方案?答案是肯定的,请相信,我写这篇文章的目的,就是来告诉你一个简单的解决方案来的。说了这么多,其实 我们需要解决的核心问题就只有一个,我们增加、修改、删除文章数据时,能够让分页的缓存都失效。解决方案也很简单,我们只需要引入版本号就可以了,在所有 受影响的memcached的key中都加入版本号,当我们增加、修改、删除文章数据时,版本号+1,这样就等于所有分页相关的缓存都失效了。
  实现代码如下:

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106855-1-1.html 上篇帖子: centos下memcache和memcached的安装和使用 下篇帖子: 通过spring.net中的spring.caching CacheResult实现memcached缓存
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表