博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用memcached做实时分页缓存
阅读量:5898 次
发布时间:2019-06-19

本文共 1942 字,大约阅读时间需要 6 分钟。

hot3.png

memcached做分页缓存,可能很多人会觉得麻烦而不用。因为在增加、修改、删除的过程中,你不知道会影响到哪些数据,而如果把所有分页相关的数据缓存都删除并重新生成一遍,实现又很麻烦,甚至不可行,所以干脆就用mysql直接分页,简单方便,但是这样性能却也下降了。 本章就讲一个简单的实现用memcached做分页缓存的方法。

首 先假使我们有一个文章页需要做分页显示,分页类型有按分类分页,按最新分页,按热点分页,按自定义方式分页,等等。这就出现了一个比较棘手的问题,我们对 数据的更新影响到哪些分页我们是不可知的,不知道需要删除哪些相关的缓存。你可能会想,更新数据时删除所有类型分页的缓存不就好了。那我问你,有多少种分 页类型,每个类型各有多少页,key的组成方式各是什么,如果分页带有其他get查询参数,你怎么知道get都传递了哪些值,不知道这些,你怎么删除全部分页缓存。

讲到这里,你可能会觉得有点失望吧,不是吗,没想到用memcached做 分页缓存原来这么麻烦。那么,有没有简单的解决方案?答案是肯定的,请相信,我写这篇文章的目的,就是来告诉你一个简单的解决方案来的。说了这么多,其实 我们需要解决的核心问题就只有一个,我们增加、修改、删除文章数据时,能够让分页的缓存都失效。解决方案也很简单,我们只需要引入版本号就可以了,在所有 受影响的memcachedkey中都加入版本号,当我们增加、修改、删除文章数据时,版本号+1,这样就等于所有分页相关的缓存都失效了。

实现代码如下: 

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

转载于:https://my.oschina.net/BearCatYN/blog/373501

你可能感兴趣的文章
BodyPaint__操作步骤
查看>>
poj 2234 Matches Game
查看>>
2018年全国多校算法寒假训练营练习比赛(第五场)
查看>>
sax方式解析XML学习笔记
查看>>
Springboot配置(上)
查看>>
Luogu345: [POI2007]POW-The Flood
查看>>
java--Eclipse for mac 代码提示(代码助手,代码联想)快捷键修改
查看>>
Jdom的简单操作
查看>>
left join on/right join on/inner join on/full join on连接
查看>>
Codeforces 582B Once Again
查看>>
template.helper 多参数
查看>>
RadioButton布局图片+文字 实现tabhost效果
查看>>
[HEOI2012]采花
查看>>
access中设置不等于
查看>>
hdu 1221 Rectangle and Circle
查看>>
Android 四大组件之四(ContentProvider)
查看>>
Android 四大组件之一(Activity)
查看>>
扫描(一)
查看>>
MySQLDump在使用之前一定要想到的事情 [转载]
查看>>
PIE SDK矢量数据的读取
查看>>