php caching framework


做php也满打满算2年多了.期间有了很多的收获,在实际运行的项目中也学到了不少东西.

是时候该做点什么了.于是决定开一个天坑..自己写一个 php框架 !

先列一列想要完成的目标吧….

  1. 数据层完全的缓存化,缓存队列化
  2. 完整的routes支持
  3. restful的底层强制全api支持
  4. view层支持wap,web,app啥的

目前想到的能用到的技术:

  1. 参考框架:thinkphp(routes和model层值得参考~)
  2. php-resque(php后台守护进程,数据层缓存核心)
  3. 方便curd的后台界面(bootstrap啥的先出个能用的)
  4. 现有php缓存技术:xcache&yac

目前主要遇到的问题:

传统的数据层都说的是php-mysql方式,对于老式的网站来说性能还不错,但是对于现在的实时性要求比较高的网站来说,读写的效率就有点不行了

一个典型的需求就是需要对页面访问量记性统计,每次都update一下一个mysql的表的话很占用操作和锁.

还有面对sns类的粉丝或者关注的计算存储,一般根据mysql表的定义都是是在分开的表去->;count一下的.

上述这些操作对数据唯一性要求不是很高.很多只是单纯的计算更新统计啥的.所以可以通过加入一层缓存来实现快速的响应.这也是目前很常用的缓存场景

不过上述的缓存机制一般是这样的:


<?php
$data = cache_get($cache_name);
if(!$data){
    $data = long_cache_calc_func($info);
    cache_set($cache_name, $data, $ttl);
}
return $data;
?>

这样写本身没什么问题,但是一旦缓存过期了(这是必然的),那么下一次第一个请求这个缓存的人就会重新计算缓存,导致较长的等待时间.

按照这个方式来计算的话,假设计算一次缓存数据需要时间a,其他程序执行时间为b,限定时间内的同时并发的请求总数为n,没有启用缓存的时候执行时间是 *(a+b)n ,启用缓存之后的时间为 *((n-1)b)+(a+b) ,可以算出来,采用了缓存技术之后对页面加载时间有很大的帮助.详见例子页面:

图表

但是光是这样的计算存在一定的问题,就是在缓存过期的那个时候会有一个大的用户延迟时间(重新计算缓存数据的时间),而通过采用异步队列的方式来更新缓存的话会得到一个更加美好的曲线.详见页面:图表

选择不同的数据计算时间可以明显的发现,随着计算数据的时间的增加,不使用缓存页面时间显著增加,使用缓存之后会导致在特定的访问的时候界面响应增大.(计算时间是与系统数据量正相关的,可以大概的认为,随着业务量与用户的增加,计算时间同比增长)

而新的异步缓存核心是异步 计算/更新 缓存,当遇到缓存过期的时候,首先返回过期的缓存,然后向队列写入一个需要更新缓存的操作,然后再由另外的worker进程来实际的执行缓存的更新操作,到达所有用户都可以直接返回缓存的同时,后台更新缓存的效果

新的缓存获取方式是这样的:

<?php
return cache_get($cache_name, $long_cache_calc_func, $context_array);
?>

从缓存获取方式来看简单了很多,但是需要一个设计良好的回调方式来让work知道正确的缓存更新函数,同时在上下文$context_array里面描述缓存的需要的数据与过期时间等信息

待续

comments powered by Disqus