• shopnc 商城源码阅读笔记-缓存技术


    缓存方式 :

    从 shopnc 的缓存驱动目录 /framework/cache里已有的实现类来看,shopnc支持以下5种缓存方式

    1.   apc
    2.   Eaccelerator
    3.   file
    4.  memcache
    5.  xcache

    apc,Eaccelerator,xcache差不多是一个东西,都是PHP底层的加速模块,他们主要用于缓存PHP的代码,在缓存用户数据方面应该是比较少见的。

    而memcache是一款系统集成的内存对象缓存系统,他对提高PHP的加载速度是没有任何作用的,主要作为中间件,缓存数据库的数据

    memcache也是集成在PHP pecl里的一个组件,安装好PHP后,它就默认被集成了,但一般默认都是关闭的,所以需要在php.ini里打开memcache.dll注释,就安装上了。

    我以前陷入过memcache的坑里,因为有一个叫memcached的缓存系统。而memcached是一个第三方的缓存系统,需要单独安装应用,开启守护进程,才能正常工作。

    虽然一字之差,差别却是很大的。

    memcache集成在php中也不利于分布式部署,会增加单机的负载,所以逐渐被其他缓存方式如memcached,redis替代了。

    总结shopnc在这缓存方式的选择: shopnc创作之初就不是面向程序员团体,并不是很纯正的开源项目,主要代码贡献者也是创始人团队。

    民间使用者主要是一些站长,外包公司之类的,造成shopnc一直都是外包,接私活的宠儿,很少人会去关心他的代码质量,性能指标什么的,而对快速方便部署却有要求,

    所以为什么缓存系统都是php自带的,这样大大减轻了部署的难度,让更多人用到(就可以收更多的版权费,哈哈).

    应用实例: 

    一般用到缓存最多的应该是

    1. 首页
    2. 商品详细页
    3. 分类页

    这几个页面,因为这几个页面访问最多,而且要给用户带来一种 "网站很快" 的感觉,所以我就从这几个页面具体分析一下shopnc对缓存的应用

    首页:

     1 class indexControl extends BaseHomeControl{
     2     //首页
     3     public function indexOp(){
     4         Language::read('home_index_index');
     5         Tpl::output('index_sign','index');
     6 
     7         //推荐店铺
     8         $model_store = Model('store');
     9         $r_store = $model_store->getRecommendStore(9);
    10         Tpl::output('show_recommend_store',$r_store);
    11         
    12         //收藏店铺
    13         $f_store = $model_store->getFavoritesStore(3);
    14         Tpl::output('show_favorites_store',$f_store);

    首页会重复数次如上红色的代码来获取要展示在首页的数据,而具体获取的动作是在模型中有具体的方法去实现,下面代码种的F方法就是用于写入缓存,但是这种写入缓存的方式只支持文件缓存,

    所以上面的代码都是使用文件缓存,这让人感觉很困惑.

    并且shopnc并不能设置缓存过期时间,没有更新时机,只有后台删除缓存才会更新,如果比较疏于管理,网站首页就会给人一种万年不变的感觉.

     1     public function getCacheStore($count = 3,$cache_name,$condition,$order) {
     2         //$cache_name = store
     3         $list = F($cache_name,'','cache/index');
     4 
     5         if (!$list){
     6             $field = 'store_id,store_name,member_name,store_domain,store_credit,store_logo';
     7             $list = $this->field($field)->where($condition)->order($order)->limit(5)->select();
     8             if(!empty($list)) {
     9                 foreach ($list as $key=>$value) {
    10                     $value['store_logo'] = getStoreLogo($value['store_logo']);
    11                     $value['credit_arr'] = getCreditArr($value['store_credit']);
    12                     $list[$key] = $value;
    13                 }
    14 //                统计店铺商品数量
    15                 $list = $this->getGoodsCountByStoreArray($list);
    16             }
    17             //写入缓存,什么时候更新缓存?  没有更新时机,只有后台删除缓存才会更新
    18             F($cache_name,$list,'cache/index');
    19         }
    20         if(count($list) <= $count) {
    21             return $list;
    22         } else {
    23             return array_slice($list,0,$count);
    24         }
    25     }

    商品详细页:

    这个页面中有用到memcache缓存,写入是用wcache()方法,读取是用rcache()方法.

    缓存的全局过期方法可以在config.ini.php中设置,默认为3600,然而这个时间对文件缓存却不适用,抹泪....

    1 //生成缓存的键值
    2         $hash_key = $goods_array['goods_id'];
    3         //先查找$hash_key缓存
    4         $cachekey_arr = array('likenum','sharenum','brand_name');
    5         if ($_cache = rcache($hash_key,'product')){
    6             foreach ($_cache as $k=>$v){
    7                 $goods_array[$k] = $v;
    8             }
    9         }else {

    上面的代码是在/control/goods.php中的indexop()方法中,主要用于缓存用户喜爱的商品数量和列表.

    总结:SHOPNC的缓存部署简单,对于提高性能有很大的帮助,而且缓存方式简单,封装合理,虽然有些过时,但如果对shopnc进行二次开发,并没有重构缓存系统的必要.

  • 相关阅读:
    POJ-3468 A Simple Problem with Integers(线段树、段变化+段查询、模板)
    CSUOJ-1978 LXX的图论题(最短路、Bellman-Ford判断负圈)
    CSU-1975 机器人搬重物(BFS)
    POJ-3522 Slim Span(最小生成树)
    POJ-1733 Parity game (并查集)
    libmysqlclient.so.16未找到方法
    python 不同目录间的模块调用
    python模块详解 logging
    python模块详解 re
    python模块详解 hashlib
  • 原文地址:https://www.cnblogs.com/tingzhi/p/5833043.html
Copyright © 2020-2023  润新知