ThinkSNS 缓存数据原理简单研究

原创 2015年07月06日 18:20:54

研究背景:不是很熟悉PHP语言,通过 echo输出、工作搜索等方式倒推出这个流程出来的..........微笑

1.访问UR:http://localhost/test/test/index.php?app=public&mod=Index&act=index

通过该地址就定位到了:IndexAction----》function index-----》$this->display();---》$this->fetch-------》 return fetch($templateFile, $this->tVar, $charset, $contentType, $display);

研究发现最后一个fetch会被调用多次,第一次的入口就如上面的分析流程,至于第二次第三次的根源入口不详

其中某次调用fetch时是返回的我关注的微博数据,下面我们来倒推下这个微博数据的来源吧

2.fetch-------------》Widget-----》renderFile(倒推)

rederFile是对指定的模板和数组数据进行结合并且输出


---->FeedListWidget--->getData---->render  这是widget的子类,作用是获取微博的数据,并且加以渲染

其中 getData中$list =  model('Feed')->getFollowingFeed($where,$this->limitnums,'',$var['fgid'],$max);实际上拉取到了微博内容

对应方法定义在FeedModel---getFollowingFeed

其中    $feedlist['data'] = $this->getFeeds($feed_ids);实际拉倒到了微博信息

其中$cacheList = model('Cache')->getList('fd_', $feed_ids);拉倒到了微博信息

对应在CacheModel的getList

其中$data[$k] = $this->get($_k)获取数据

其中  $data = $this->handler->get($key);// 获取缓存数据,其中的key就是Feed表中的主键

而handler:$this->handler = Cache::getInstance($type);

handler是一个Cache实例,是文件缓存的句柄(protected $type = 'FILE';                // 缓存类型,默认为文件缓存)


综合上面的流程来看,其实就是从缓存文件中读取数据,并且与相应的模板结合输出到浏览器,但是对于微博的key每次都是要从数据库读取出来的,

这样想想可以确保数据的及时变化和内容的缓存有效的结合在一起,删除内容后缓存及时得到变更,读取数据效率也得到极大的提升


那么还有一个问题值得我们思考的就是,是谁调用了FeedListWidget.render呢,经过查找,发现是被function.inc.php中的W函数调用了


那么W函数在哪里呢,看这个

typefollowing----------ssssssss啦-------------------------------hi boy-------------
templateFile:C:\wamp1\www\test/apps/public/Tpl/default/Index/index.htmltemplateCacheFile:C:\wamp1\www\test/_runtime/tplcache//public_a8bfdef57b7c8498.php

这个是第一次进入fetch中输出的一个模板文件,模板文件中有这么一句话

<!--feed list-->
                    <?php echo W('FeedList',array('type'=>$type,'feed_type'=>$feed_type,'feed_key'=>$feed_key,'fgid'=>t($_GET['fgid'])));?>
                    </div>
                    </div>

哈哈,原来就是在这里使用了W函数,到此我们就分析出来了微博内容是因为我们访问了那个URL ,得到模板文件,而模板文件使用了W函数,

然后进行了render调用,然后响应的Widget实例,调用fetch函数从而把其他小模板和数据集合渲染出来,看样子,我们开始的那个 模板文件相当于

这个页面的向导模板,通过这个向导,我们把各个零散的模板组织在一起从而呈现出一个页面出来


思考1:既然每次还是要读取数据库,那么如何保证数据库的性能呢?

FeedModel里查询我关注的微博首先查询我关注的用户发表的微博id,通过联合查询区查询

        $table = "{$this->tablePrefix}feed AS a LEFT JOIN {$this->tablePrefix}user_follow AS b ON a.uid=b.fid AND b.uid = {$buid}";

关于这一点,我很头疼,数据量一旦过大必然会导致性能的降低,如何做好分库分表值得深思解决!



思考2:文件缓存是如何保持它的高效性能呢?如何切换到别的缓存呢?

我们可以把缓存用成memcache,然而这个cache我想也是需要切割的,那么如何有效的和数据库分库分表结合到一起呢,值得深思


案例下载:http://pan.baidu.com/s/1vz15k

相关文章推荐

iOS OpenGL ES 研究一:渲染、缓存数据、上下文、几何知识

前言:如题、本文介绍以下四个方面:1.渲染:3D->2D 降维 2.缓存数据 3.上下文 4.几何知识 一、渲染的概念?3D->2D屏幕是2 维的、但我们在屏幕中看到的东西是3 维的。由3 维降到2 ...
  • Xoxo_x
  • Xoxo_x
  • 2017年05月13日 16:09
  • 416

缓存数据的代码

  • 2017年11月08日 16:06
  • 1KB
  • 下载

不要在Android的Application对象中缓存数据

不要在Android的Application对象中缓存数据

清理Chrome缓存数据

  • 2009年06月25日 16:03
  • 20KB
  • 下载

如何为Android缓存数据到本地

如何为Android缓存数据到本地对于一个应用来说,有许多的数据是不需要实时访问网络的,或者在用户第二次打开应用的时候 ,访问网络可能不是特别的快 ,但是此时的应用是没有数据展示的,这时候就会涉及到 ...

Android清理SD卡缓存数据源代码

  • 2015年08月09日 14:56
  • 1.44MB
  • 下载

沙盒操作demo、缓存数据

  • 2014年11月29日 16:16
  • 3KB
  • 下载

MySQL UDF实现缓存数据同步

[文章作者:张宴 本文版本:v1.0 最后修改:2010.09.08 转载请注明原文链接:http://blog.s135.com/mysql-udf-http/]   Mysql-udf-ht...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ThinkSNS 缓存数据原理简单研究
举报原因:
原因补充:

(最多只允许输入30个字)