在帮一个朋友写一个在线客服的管理系统,这个系统很小,但是涉及的东西却不少,逻辑性也比较强。
先简单说下功能:
1,时间段,可针对一周的每天制定时间段
2,一个QQ可分配多个时间段
3,QQ分组,每个组有2种显示模式,一种是按照该组所有的在线QQ显示(通过腾讯提供的一个接口来判断是否在线),一种按照该组属于当前时间段并且在线的QQ进行显示
4,每个组每次仅显示一个QQ号,具体显示哪个由针对该组设置的轮显周期来决定(一个时间,比如15分钟显示下一个)
5,一个QQ可属于多个组
6,每个QQ有两种状态,一种为正常,一种为请假,如果为请假则不显示该QQ,而显示为该QQ设置的替代QQ号进行显示
我这个没有什么项目经验的新手,对处理这些问题还没有形成一个定式,只能在黑暗中摸索,可以说,困难重重:
1,数据复用
部分数据,不管在前台还是后台,使用次数都非常频繁,例如组信息,还有组与QQ的关联信息,QQ与时间段的关联信息,这部分数据
如果每次使用都需要复制数据获取的代码的话,不仅繁琐,而且对维护会带来极大的不便,对于将这些数据封装为对象,也同样比较麻烦,
对性能也会造成一定影响,而且数据的组织也一样显得凌乱不堪(也许是我的封装方式的原因,我是第一次开始尝试全站面向对象)
2,性能
对于这个系统来说,性能至关重要,因为在页面调用时是include的前台显示页面(尽管我一再强调可以使用iframe包含,但是客户不同意),如果性能低下,将会对整站的性能
造成一个很大的拖累,缓存前台显示内容虽然可以部分解决,但是因为缓存生命周期非常短暂(要受到QQ轮显周期的限制,且要比轮显周期低的多才能保证数据更新的及时性),而每次重新获得数据都需要有大量的数据库操作,尽管每个表都很小,
但是我还是希望尽力避免
综上所述,我希望寻找一种更加节省开发时间,更加高性能,复用数据更加简单,更加利于维护的方案,让我高兴的是,我找到了:使用缓存
我这里说到的缓存,并不是原本我认识中单打独斗的缓存,而是成系统的进行缓存,这种缓存方案,只适合与那些调用频繁,而又信息量不多的情况,例如用户组,栏目等。
也许这种方案很烂,或者已经为人所采用,我仍出板砖一块,砸到高手一名,能引的那位高手向我仍出一块美玉,我就赚到了。
先来看一下缓存读取函数的示意代码:
复制PHP内容到剪贴板
PHP代码:
<?php function read_cache($cacheId) //这种缓存方式不需考虑生命周期 { static $isCache = array(); if (isset($isCache[$cacheId])) return $isCache[$cacheId]; //头两行代码用来保证一个缓存在一个页面中仅被读取一次 $cache = CACHE_DIR.'/'.md5($cacheId).'.php'; if (!file_exists($cache)) { include('CacheManager.php'); $cm = new CacheManager($cacheId); //重新生成缓存,或许有时候需要清空缓存,此部分用来保障缓存的可用性 unset($cm); } //读取缓存内容的代码 $isCache[$cacheId] = '缓存内容'; return $isCache[$cacheId]; } ?>
下面看一下缓存生成的代码
复制PHP内容到剪贴板
PHP代码:
<?php class CacheManager { private $conf = array( 'abc' => 'groupCache', 'bce' => 'groupCache', //这两个缓存ID,同时指向了groupCache方法,因为这两个ID的缓存是在这一个方法中同时生成的 'edf' => 'classCache' //这个缓存ID,指向了classCache方法 ); //负责通过缓存ID判断具体调用哪个函数来生成缓存 public function __construct($cacheId) { if (isset($this->conf[$cacheId])) { $method = $this->conf[$cacheId]; $this->$method(); } else { exit('错误的缓存ID'); } } //用户组表相关缓存生成 private function groupCahce() { //查询数据库,读取需要的记录 //将数据格式化为一定结构的数组 //写入缓存 } //栏目相关缓存生成 private function classCache() { //查询数据库,读取需要的记录 //将数据格式化为一定结构数组 //写入缓存 } } ?>
缓存的形式是灵活多样的,拿我上述的那个项目中的QQ与组的关联表来说:
你也许需要这样的形式:
复制PHP内容到剪贴板
PHP代码:
<?php array( 'QQID' => array('组1ID','组2ID'), ); //和 array( '组1ID' => array('QQ1ID', 'QQ2ID'), ); ?>
宗旨就是,怎么简单方便怎么来。
我的这套缓存方案的优点就是,所有缓存的生成集中管理,在调用缓存数据时,不需要考虑这个缓存是如何生成的,直接拿来用就可以。
当然,也有缺点,那就是不适合大数据量的缓存,这套方案的适用范围就是那些在一个应用中需要频繁调用的那些数据。
同时有一点需要注意:为了保证所有数据都是最新的,你需要在编辑一个进行了缓存的表时重新生成缓存。
以上代码,仅仅是示意,具体如何去用,还需要您自己去参详。