今天研究ecshop的cls_mysql类库,

涉及到mysql 和memcache 的整合 category.php

商品属性帅选时使用memcache缓存

mysql

public function getColCached($sql, $cached = 'FILEFIRST')
{
$cachefirst = ($cached == 'FILEFIRST' || ($cached == 'MYSQLFIRST' && $this->platform != 'WINDOWS')) && $this->max_cache_time;
if (!$cachefirst)
{
return $this->getCol($sql);
}
else
{
$result = $this->getSqlCacheData($sql, $cached);
if (empty($result['storecache']) == true)
{
return $result['data'];
}
}
$arr = $this->getCol($sql);
if ($arr !== false && $cachefirst)
{
$this->setSqlCacheData($result, $arr);
}
return $arr;
}

function getSqlCacheData($sql, $cached = '')
{
$sql = trim($sql);
$result = array();
$result['filename'] = $this->root_path . $this->cache_data_dir . 'sqlcache_' . abs(crc32($this->dbhash . $sql)) . '_' . md5($this->dbhash . $sql) . '.php';
$mem=Instance_Memcached();
if($mem===false)
{
$data = @file_get_contents($result['filename']);
}
else{
$key='SqlCacheData_'.substr(md5($result['filename']),0,8);
$data=$mem->get($key);
}
if (isset($data{23}))
{
$filetime = substr($data, 13, 10);
$data = substr($data, 23);
if (($cached == 'FILEFIRST' && time() > $filetime + $this->max_cache_time) || ($cached == 'MYSQLFIRST' && $this->table_lastupdate($this->get_table_name($sql)) > $filetime))
{
$result['storecache'] = true;
}
else
{
$result['data'] = @unserialize($data);
if ($result['data'] === false)
{
$result['storecache'] = true;
}
else
{
$result['storecache'] = false;
}
}
}
else
{
$result['storecache'] = true;
}
return $result;
}
function setSqlCacheData($result, $data)
{
$mem=Instance_Memcached();
if($mem===false)
{
if ($result['storecache'] === true && $result['filename'])
{
@file_put_contents($result['filename'], '<?php exit;?>' . time() . serialize($data));
clearstatcache();
}
}
else{
$key='SqlCacheData_'.substr(md5($result['filename']),0,8);
$mem->set($key,'<?php exit;?>' . time() . serialize($data),0,$this->max_cache_time);
}
}

/* 属性筛选 */
if ($cat['filter_attr'] > 0)
{
$cat_filter_attr = explode(',', $cat['filter_attr']); //提取出此分类的筛选属性
$all_attr_list = array();
$attr_selected = array();
$ext_goods_ids=get_extension_goods($children,true);
$attr_filter=get_category_attr_filter($cat_id,$cat,$cat_id_array,$cat_filter_attr,$filter_attr,$brand,$shipin24hrs,$onsales,$ext_goods_ids);
$smarty->assign('attr_selected', $attr_filter['attr_selected']);
$smarty->assign('filter_attr_list', $attr_filter['filter_attr_list']);

/* 扩展商品查询条件 */
$ext = ''; //商品查询条件扩展
$ext_group_goods = array();
$ext_group_goods_intersect = array();
if (!empty($filter_attr))
{
$ext_sql = "SELECT DISTINCT(b.goods_id) FROM " . $ecs->table('goods_attr') . " AS a, " . $ecs->table('goods_attr') . " AS b " . "WHERE ";
foreach ($filter_attr AS $k => $v) // 查出符合所有筛选属性条件的商品id */
{
if ($v != 0)
{
$sql = $ext_sql . "b.attr_value = a.attr_value AND b.attr_id = '" . $cat_filter_attr[$k] ."' AND a.goods_attr_id = " . $v;
$ext_group_goods = $db->getColCached($sql);
$ext .= ' AND ' . db_create_in($ext_group_goods, 'g.goods_id');
$ext_group_goods_intersect=empty($ext_group_goods_intersect)? $ext_group_goods : array_intersect($ext_group_goods_intersect,$ext_group_goods);
}
}
$sql="select attr_value from ".$ecs->table('goods_attr')." where goods_attr_id in (".implode(',',$filter_attr).")";
$attr_values=$db->getCol($sql);
if($attr_values)
{
foreach($attr_values as $key => $value)
{
$value=explode('_',$value);
$attr_values[$key]=$value[0];
}
}
$attr_values=implode(' ',$attr_values);
$smarty->assign('attr_values', $attr_values);
}
unset($ext_group_goods);
if (!empty($filter_attr) && empty($ext_group_goods_intersect))
{
$ext_group_goods_intersect=false;
}
}

memcached 细究(三)的更多相关文章

  1. Memcached总结三:Memcached常用命令及使用说明

    一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> < ...

  2. memcached 细究(二)

    { CentOS ping命令 分布式部署服务器时用到ping命令 #ping -c 4 192.168.16.1 //ping4次后结束. }   使用telnet 查看memcached 运行状态 ...

  3. memcached 细究(一)

    memcached是高性能的分布式的内存缓存服务器.由国外社区网站LIVEJOURNAL的开发团队开发. 使用目的: 通过缓存数据库查询结果,减少数据库的访问次数,以提高动态web应用的速度.提高可扩 ...

  4. MemCached总结三:PHP的memcached管理接口

    在Web系统中应用MemCached缓存技术,必须使用客户端API(PHP)进行访问,这样才能将用户请求的动态数据,缓存到memcached服务器中,来减少对数据库的访问压力.PHP中提供了用于内存缓 ...

  5. Memcached学习(三)

    通过Java客户端实现与Memcached的交互,Java客户端的实现了使用了开源的Memcached-Java-Client,开源地址在GitHub上. 如下是通过该开源库实现的Memcached交 ...

  6. 分布式缓存技术memcached学习(三)——memcached内存管理机制

    几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...

  7. Memcached(三)Memcached配置参数初解

    一.基本参数在我们第一次安装Memcached时,一般都是用过这个命令: memcached -m 512 -u root -d -l 127.0.0.1 -p 11211 我们先来解释这几个参数的含 ...

  8. 分布式缓存技术memcached学习系列(三)——memcached内存管理机制

    几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...

  9. NoSql1 在Linux(CentOS)上安装memcached及使用

    前言:       今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...

随机推荐

  1. lambda 、 map 、filter 、reduce 及 reversed 常用函数

    lambda 匿名函数 什么是lambda? lambda 操作符(或 lambda 函数)通常用来创建小巧的,一次性的匿名函数对象.它的基本语法如下: lambda arguments : expr ...

  2. “全栈2019”Java第一百一十一章:内部类可以被覆盖吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. nginx配置文件中,location字段里面的root字段和别名alias

    1. location里面的root例子 server{ listen ; server_name www.wzw.com; location /www { root /data/; //设置虚拟主机 ...

  4. random 模块常用方法学习

    >>> import random#随机小数>>> random.random() # 大于0且小于1之间的小数0.7664338663654585>> ...

  5. 工具篇-大数据组件的一些快捷Shell操作

    一.Hbase 1. HBase shell窗口进入 执行hbase shell 2. HBase表的创建 # 语法:create <table>, {NAME => <fam ...

  6. 【实战】Axis2后台Getshell

    实战遇到的情况---任意文件读取,读取/conf/axis2.xml内容,读取用户名和密码登录后台 当然弱口令也是屡试不爽的. 操作起来 1.上传cat.aar(链接:https://pan.baid ...

  7. postgresql客户端连接错误的解决方法【转】

    今天在重新设置postgresql服务器以后却发现启动不了服务器.错误如下:psql: could not connect to server: No such file or directory   ...

  8. (转)DB2性能优化 – 如何通过调整锁参数优化锁升级

    原文:http://blog.51cto.com/5063935/2074306 1.概念描述 所谓的锁升级(lock escalation),是数据库的一种作用机制,为了节约内存的开销, 其会将为数 ...

  9. (转)Mysql占用过高CPU时的优化手段

    Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processli ...

  10. java_Proxy动态代理_AOP

    讲了JDK里使用Proxy动态代理的机制,详细过程. 切面类TransactionHandler需要实现InvocationHaandler接口,实现它的invoke方法. 项目目录: User类代码 ...