PHP用memcached做实时分页
用memcached做分页缓存,可能很多人会觉得麻烦而不用。因为在增加、修改、删除的过程中,你不知道会影响到哪些数据,而如果把所有分页相关的数据缓存都删除并重新生成一遍,实现又很麻烦,甚至不可行,所以干脆就用mysql直接分页,简单方便,但是这样性能却也下降了。 本章就讲一个简单的实现用memcached做分页缓存的方法。
首先假使我们有一个文章页需要做分页显示,分页类型有按分类分页,按最新分页,按热点分页,按自定义方式分页,等等。这就出现了一个比较棘手的问题,我们对数据的更新影响到哪些分页我们是不可知的,不知道需要删除哪些相关的缓存。你可能会想,更新数据时删除所有类型分页的缓存不就好了。那我问你,有多少种分页类型,每个类型各有多少页,key的组成方式各是什么,如果分页带有其他get查询参数,你怎么知道get都传递了哪些值,不知道这些,你怎么删除全部分页缓存。
讲到这里,你可能会觉得有点失望吧,不是吗,没想到用memcached做分页缓存原来这么麻烦。那么,有没有简单的解决方案?答案是肯定的,请相信,我写这篇文章的目的,就是来告诉你一个简单的解决方案来的。说了这么多,其实我们需要解决的核心问题就只有一个,我们增加、修改、删除文章数据时,能够让分页的缓存都失效。解决方案也很简单,我们只需要引入版本号就可以了,在所有受影响的memcached的key中都加入版本号,当我们增加、修改、删除文章数据时,版本号+1,这样就等于所有分页相关的缓存都失效了。
//备注:假使下面函数都已经已经初始化$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(),所以得不到新版本号的缓存数据,就从数据库查到,然后生成新版本的缓存,旧的缓存在时间过期之后会自动释放内存空间。
PHP用memcached做实时分页的更多相关文章
- Mybatis利用拦截器做统一分页
mybatis利用拦截器做统一分页 查询传递Page参数,或者传递继承Page的对象参数.拦截器查询记录之后,通过改造查询sql获取总记录数.赋值Page对象,返回. 示例项目:https://git ...
- 使用MVCPager做AJAX分页所走的弯路
使用MVCPager做AJAX分页所需要注意的地方: 1.版本问题,推荐使用2.0以上,对ajax支持才比较的好了 2.当需要使用页索引输入或下拉框以及使用Ajax分页模式时,必须用Html.Regi ...
- ElasticSearch做实时OLAP框架~实时搜索、统计和OLAP需求,甚至可以作为NOSQL来使用(转)
使用ElasticSearch作为大数据平台的实时OLAP框架 – lxw的大数据田地 http://lxw1234.com/archives/2015/12/588.htm 一直想找一个用于大数据平 ...
- Memcached做Tomcat的session共享
基于cache DB缓存的session共享 基于memcache/redis缓存的session共享.即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cac ...
- sersync做实时同步(第二步)
配置文件一般都在sersync2的根目录下.为.xml文件 下面做逐行的进行解释说明: <host hostip="localhost" port="8008&qu ...
- 如何做实时监控?—— 参考 Spring Boot 实现
随着 微服务 的流行,相比较以前一个大型应用程序搞定所有需求,我们现在更倾向于把大型应用程序切分成多个微服务,服务之间通过 RPC 调用.微服务架构的好处非常多,例如稳定的服务变化较少,不会被非稳定服 ...
- SignalR来做实时Web聊天
本章和大家分享的内容是使用Signal R框架创建个简易的群聊功能,主要讲解如何在.Net的MVC中使用这个框架,由于这个项目有官方文档(当然全英文),后面也不打算写分享篇了,主要目的是让朋友们在需要 ...
- 我是如何用redis做实时订阅推送的
前阵子开发了公司领劵中心的项目,这个项目是以redis作为关键技术落地的. 先说一下领劵中心的项目吧,这个项目就类似京东app的领劵中心,当然图是截取京东的,公司的就不截了... 其中 ...
- solr使用cursorMark做深度分页
深度分页 深度分页是指给搜索结果指定一个很大的起始位移. 普通分页在给定一个大的起始位移时效率十分低下,例如start=1000000,rows=10的查询,搜索引擎需要找到前1000010条记录然后 ...
随机推荐
- 什么时候应该使用C#的属性
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:什么时候应该使用C#的属性.
- 设置JVM内存溢出时快照转存HeapDump到文件
诊断内存溢出是一个有难度的事情,可以在生产环境试一试下面的参数,在发生内存溢出OutOfMemoryError时做HeapDump并保存到文件,然后分析该文件看是否能查到蛛丝马迹. set JAVA_ ...
- JavaScript实现竖直文本滚动
一.HTML代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- careercup-递归和动态规划 9.11
9.11 给定一个布尔表达式,由0.1.&.|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式得出result值. 解法: 跟其他递归问题一样 ...
- Why String is immutable in Java ?--reference
String is an immutable class in Java. An immutable class is simply a class whose instances cannot be ...
- java class 文件解析
参考下面两个文章对一个class文件进行解析: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4.6 htt ...
- bootstrap系列整理
去年的九月份做第一版文档站时, 就开始尝试使用bootstrap ,由于当时对node 还一知半解,大部分精力放在nodejs上,bootstrap只是拿来就用,起步文档都没看: 当别人提到 Norm ...
- char与varchar区别
char:储存定长数据,长度不够,以空格填满.储存效率高. varchar: 变长数据,根据数据长度储存,节省空间,效率低.
- Redhat YUM U盘源配置
Redhat YUM U盘源配置 1)在U盘创建目录 #mkdir /yum/Server 并从光盘Server.Packages 目录的所有文件拷贝到/yum/Server 2)安装 creater ...
- modelsim脚本文件的编写
第一章 ModelSim介 绍 本指南是为 ModelSim5.5f版本编写的,该版本运行于UNIX和Microsoft Windows 95/98/Me/NT/2000的操作系统环境中.本指南覆盖了 ...