memcached 细究(三)
今天研究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 细究(三)的更多相关文章
- Memcached总结三:Memcached常用命令及使用说明
一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> < ...
- memcached 细究(二)
{ CentOS ping命令 分布式部署服务器时用到ping命令 #ping -c 4 192.168.16.1 //ping4次后结束. } 使用telnet 查看memcached 运行状态 ...
- memcached 细究(一)
memcached是高性能的分布式的内存缓存服务器.由国外社区网站LIVEJOURNAL的开发团队开发. 使用目的: 通过缓存数据库查询结果,减少数据库的访问次数,以提高动态web应用的速度.提高可扩 ...
- MemCached总结三:PHP的memcached管理接口
在Web系统中应用MemCached缓存技术,必须使用客户端API(PHP)进行访问,这样才能将用户请求的动态数据,缓存到memcached服务器中,来减少对数据库的访问压力.PHP中提供了用于内存缓 ...
- Memcached学习(三)
通过Java客户端实现与Memcached的交互,Java客户端的实现了使用了开源的Memcached-Java-Client,开源地址在GitHub上. 如下是通过该开源库实现的Memcached交 ...
- 分布式缓存技术memcached学习(三)——memcached内存管理机制
几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...
- Memcached(三)Memcached配置参数初解
一.基本参数在我们第一次安装Memcached时,一般都是用过这个命令: memcached -m 512 -u root -d -l 127.0.0.1 -p 11211 我们先来解释这几个参数的含 ...
- 分布式缓存技术memcached学习系列(三)——memcached内存管理机制
几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...
- NoSql1 在Linux(CentOS)上安装memcached及使用
前言: 今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...
随机推荐
- lambda 、 map 、filter 、reduce 及 reversed 常用函数
lambda 匿名函数 什么是lambda? lambda 操作符(或 lambda 函数)通常用来创建小巧的,一次性的匿名函数对象.它的基本语法如下: lambda arguments : expr ...
- “全栈2019”Java第一百一十一章:内部类可以被覆盖吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- nginx配置文件中,location字段里面的root字段和别名alias
1. location里面的root例子 server{ listen ; server_name www.wzw.com; location /www { root /data/; //设置虚拟主机 ...
- random 模块常用方法学习
>>> import random#随机小数>>> random.random() # 大于0且小于1之间的小数0.7664338663654585>> ...
- 工具篇-大数据组件的一些快捷Shell操作
一.Hbase 1. HBase shell窗口进入 执行hbase shell 2. HBase表的创建 # 语法:create <table>, {NAME => <fam ...
- 【实战】Axis2后台Getshell
实战遇到的情况---任意文件读取,读取/conf/axis2.xml内容,读取用户名和密码登录后台 当然弱口令也是屡试不爽的. 操作起来 1.上传cat.aar(链接:https://pan.baid ...
- postgresql客户端连接错误的解决方法【转】
今天在重新设置postgresql服务器以后却发现启动不了服务器.错误如下:psql: could not connect to server: No such file or directory ...
- (转)DB2性能优化 – 如何通过调整锁参数优化锁升级
原文:http://blog.51cto.com/5063935/2074306 1.概念描述 所谓的锁升级(lock escalation),是数据库的一种作用机制,为了节约内存的开销, 其会将为数 ...
- (转)Mysql占用过高CPU时的优化手段
Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processli ...
- java_Proxy动态代理_AOP
讲了JDK里使用Proxy动态代理的机制,详细过程. 切面类TransactionHandler需要实现InvocationHaandler接口,实现它的invoke方法. 项目目录: User类代码 ...