- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
讲解有关于缓存的话题.pdf
关于缓存的话题
29/10/2013 by yagas
当前状况
有一个项目,大家都直接使用 Yii::app()-memcache-get 方法从缓存中获取数据。咋一
看,好像没有什么不妥。但是随着项目的扩大,流程越来越复杂 ,缓存内容的增多,这个方
法所带来的隐患就越发明显了。每一次的改版或数据变动 ,都需要查找一大片的代码进行修
改(有可能还会有隐式的组装调用)。哪怕漏掉了一个地方没有更正过来都会造成系统的BUG ,
甚至是找不到根源的未知错误。
面对以上问题,我说说我的改进方案。以下的改进方法仅代表我的个人看法,如果有更
好的方法,欢迎大家一起讨论。
优化改进
计算机界有句老话,大意是:只要再多添一层间接,计算机科学中就没有解决不了的问
题(引用自《Object-C 基础教程》第 19 页)。我的处理方法就是增加一层,避免下层及协作
开发人员直接接触到数据。为避免缓存过多容易造成混乱,我们需要对缓存进行归类封装。
以网店的缓存为例:
class EShopCache{
private $_cacheKey = array(‘userName’,’shopTitle’,’isValPro’,’isValShop’);
private $_cache = array();
public function __get($key) {
if ( array_in($key, $this-_cacheKey) ){
if ( !array_key_exixts($key, $this-_cache) ) {
$this-_cache[$key] = Yii::app()-memcache-get($key);
}
return $this-_cache[$key];
}
return false;
}
}
这样改进之后,不但使用方法更简单,而且更具语义化。
$eshopCache = new EShopCache;
echo $ eshopCache -username;
if ( $ eshopCache -isValShop == 1 ) {
echo ‘网店已经进行实体认证’;
}
如果需求有变更需要对数据费进行修改,我们只需要对这个类进行修改,不需要对下一
层的每一个接口进行修改 ,也不用担心忘了修改下层的封装及隐蔽调用。
持续改进
还有一个问题,如果需求再变化。网店要显示的是用户自定义的昵称(nickName) ,而不
再是用户名(userName) ,难道我们只能翻遍文件修改了吗?改进方案如下:
class EShopCache{
private $_cacheKey = array(‘userName’,’shopTitle’,’isValPro’,’isValShop’);
private $_aliaeses = array(‘userName’=’nickName’);
private $_cache = array();
public function __get($key) {
if ( array_in($key, $this-_cacheKey) ){
if ( !array_key_exixts($key, $this-_cache) ) {
$_key = array_key_exists($key, $this-_aliases)? $this-_aliases[$key] : $key;
$this-_cache[$key] = Yii::app()-memcache-get($_key);
}
return $this-_cache[$key];
}
return false;
}
}
到此,这个类的功能已经可以满足我们使用。我提供的方案就是使用设计模式中的“代
理模式”来间接地访问缓存数据。如果有什么异议,欢迎大家发邮件到 yagas@ 共
同讨论。
文档评论(0)