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

时间:2021-12-21 11:32:46

缓存方式 :

从 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对缓存的应用

首页:

 class indexControl extends BaseHomeControl{
//首页
public function indexOp(){
Language::read('home_index_index');
Tpl::output('index_sign','index'); //推荐店铺
$model_store = Model('store');
$r_store = $model_store->getRecommendStore(9);
Tpl::output('show_recommend_store',$r_store); //收藏店铺
$f_store = $model_store->getFavoritesStore(3);
Tpl::output('show_favorites_store',$f_store);

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

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

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

     public function getCacheStore($count = 3,$cache_name,$condition,$order) {
//$cache_name = store
$list = F($cache_name,'','cache/index'); if (!$list){
$field = 'store_id,store_name,member_name,store_domain,store_credit,store_logo';
$list = $this->field($field)->where($condition)->order($order)->limit(5)->select();
if(!empty($list)) {
foreach ($list as $key=>$value) {
$value['store_logo'] = getStoreLogo($value['store_logo']);
$value['credit_arr'] = getCreditArr($value['store_credit']);
$list[$key] = $value;
}
// 统计店铺商品数量
$list = $this->getGoodsCountByStoreArray($list);
}
//写入缓存,什么时候更新缓存? 没有更新时机,只有后台删除缓存才会更新
F($cache_name,$list,'cache/index');
}
if(count($list) <= $count) {
return $list;
} else {
return array_slice($list,0,$count);
}
}

商品详细页:

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

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

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

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

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

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

shopnc 商城源码阅读笔记-缓存技术的更多相关文章

  1. shopnc 商城源码阅读笔记--开篇概述

    关于shopnc 以下是摘抄自百度百科的关于shopnc的介绍: ShopNC商城系统,是天津市网城天创科技有限责任公司开发的一套多店模式的商城系统. 本系统具有商城系统非常完整和专业的功能与流程,系 ...

  2. guavacache源码阅读笔记

    guavacache源码阅读笔记 官方文档: https://github.com/google/guava/wiki/CachesExplained 中文版: https://www.jianshu ...

  3. CI框架源码阅读笔记4 引导文件CodeIgniter&period;php

    到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...

  4. CI框架源码阅读笔记3 全局函数Common&period;php

    从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...

  5. jdk源码阅读笔记-LinkedHashMap

    Map是Java collection framework 中重要的组成部分,特别是HashMap是在我们在日常的开发的过程中使用的最多的一个集合.但是遗憾的是,存放在HashMap中元素都是无序的, ...

  6. Apollo源码阅读笔记(二)

    Apollo源码阅读笔记(二) 前面 分析了apollo配置设置到Spring的environment的过程,此文继续PropertySourcesProcessor.postProcessBeanF ...

  7. CI框架源码阅读笔记5 基准测试 BenchMark&period;php

    上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...

  8. CI框架源码阅读笔记2 一切的入口 index&period;php

    上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...

  9. 源码阅读笔记 - 1 MSVC2015中的std&colon;&colon;sort

    大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...

随机推荐

  1. MySQL二进制日志

    一.二进制日志(The Binary Log) 1.简介 包含所有更新了的数据或者已经潜在更新了的数据(比如一条没有匹配任何行的delete语句) 包含所有更新语句执行时间的信息 不记录没有修改数据的 ...

  2. CentOS两台服务器利用scp拷贝文件

    yum install -y openssh-clients scp -r -P 26611 /usr/local/ssdb-20160518/ root@10.10.6.199:/usr/local ...

  3. SQL常用代码收集

    1.存储过程中,使用in查询时的参数处理方式 使用情形描述:传入存储过程的参数为一个字符串@IDs,以固定分隔符连接 新建字符串分割函数,然后将分割结果传入存储过程: CREATE FUNCTION ...

  4. Oracle自带的用户

    Oracle安装完毕创建数据库实例的时候,会自动生成三个用户sys,system,scott. sys用户是超级管理员,具有最高权限,充当sysdba角色,可以执行create database,默认 ...

  5. 算法导论&lowbar;ch2

    Ch2算法基础 whowhoha@outlook.com 2.1 插入排序 输入:n个数的一个序列〈a1,a2,…,an〉. 输出:输入序列的一个排列〈a′1,a′2,…,a′n〉,满足a′1≤a′2 ...

  6. Android仿微信SlideView聊天列表滑动删除效果

    package com.ryg.slideview; import com.ryg.slideview.MainActivity.MessageItem; //Download by http://w ...

  7. Ubuntu启动、停止、重新启动MySQL,查看MySQL错误日志、中文编码错误

    1)启动: sudo /etc/init.d/mysql start 2)停止: sudo /etc/init.d/mysql stop 3)重新启动: sudo /etc/init.d/mysql ...

  8. linux 命令&lpar;alias &comma; unalias &comma; install &comma;ar &comma; arch &comma;uname &rpar;

    https://linux.die.net/man/ http://man.linuxde.net/ user commands 1.alias [ˈālēəs]:别名 alias --help al ...

  9. 【渗透课程】第一篇-Web渗透需要接触的语言

    ---恢复内容开始--- 上一篇我们讲过了,Web渗透的基本原理,在原理中我们也提到了Web应用程序(脚本语言),本章就谈到了Web渗透要涉及的语言. 涉及语言: 1.html:是前段语言的其中一个, ...

  10. Java中数据表的建立

    class Emp{ private int empno;//职工编号 private String ename;//姓名 private String job;//职位 private double ...