关闭

ThinkSNS 缓存数据原理简单研究

824人阅读 评论(0) 收藏 举报
分类:

研究背景:不是很熟悉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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:482815次
    • 积分:8944
    • 等级:
    • 排名:第2182名
    • 原创:395篇
    • 转载:265篇
    • 译文:1篇
    • 评论:49条
    最新评论