php 回调cache 方案,基于PHP的一种Cache回调与自动触发技术
$s = microtime(true); for($i=0; $iaaa($array, $array, $array); $data = a::bbb($array, $array, $array); } $e = microtime(true); echo "native:".($e-$s)."s\n"; $s = microtime(true); for($i=0; $i
在PHP中,知道一个对象和方法,其实调用方法很简单,比如上面的例子
$a = new a(); $data = $a->aaa($array, $array, $array); $obj = $a; $func = ‘aaa’; $params = array($array,$array,$array); $obj->$func($params[0],$params[1],$params[2]); // 通过这种方式可以直接执行 这种方式的执行性能怎么样,经过我们对比测试发现
native:0.0092940330505371s
call_user_func:0.028635025024414s
call_user_func_array:0.048038959503174s
my_callback:0.11308288574219s
在加入大量方法策略验证中,性能损耗比较低,时间消耗仅是原生方法的1.25倍左右,远小于call_user_func的3倍多,call_user_func_array的5倍多,具体封装后的代码switch(count($params)){
case 0: $result = $obj->{$func}();break;
case 1: $result = $obj->{$func}($params[0]);break;
case 2: $result = $obj->{$func}($params[0],$params[1]);break;
case 3: $result = $obj->{$func}($params[0],$params[1],$params[2]);break;
case 4: $result = $obj->{$func}($params[0],$params[1],$params[2],$params[3]);break;
case 5: $result = $obj->{$func}($params[0],$params[1],$params[2],$params[3],$params[4]);break;
case 6: $result = $obj->{$func}($params[0],$params[1],$params[2],$params[3],$params[4],$params[5]);break;
case 7: $result = $obj->{$func}($params[0],$params[1],$params[2],$params[3],$params[4],$params[5],$params[6]);break;
default: $result = call_user_func_array(array($obj, $func), $params); break;
}
在使用这种方法之前,考虑过使用create_function来创建匿名函数,执行函数回调,经过测试create_function只能创造全局函数,不能创建类函数和对象函数,遂放弃。
完成以上准备工作后,就可以使用回调机制了,再次调用的业务代码….
// 相关变量赋值
$db = new Wk_DB();
$callback[‘obj‘] = $db;
$callback[‘func‘] = ‘getTopFeeds‘;
$callback[‘params‘] =
array(‘site_id‘=>$siteid,‘boutique‘=>$seminal, ‘offset‘=>"0",
‘rows‘ => "20", ‘uid‘
=>null,‘tag_id‘=>$tag_id,‘type‘=>$type);
$top_feed_list =
$cache->smart_fetch(‘site_top_feeds‘,$callback,‘feed‘);
使用以上方法实现对cache调用的封装,同时保证性能的高效,从而解决第一和第四个问题。
至此已经完成前四个问题,从而实现Cache的封装,并有效的避免了上面提到的第二,第三,第四个问题。但是对于第五个问题,dogpile问题,并没有解决,针对这种问题,最好的方式是在cache即将失效前,有一个进程主动触发db操作,获取DB数据放入Cache中,而其他进程正常从Cache中获取数据(因为此时cache并未失效);好在有Redis缓存,我们可以使用Redis的两个特性很好解决这个问题,先介绍下这两个接口
TTL方法:以秒为单位,返回给定 key 的剩余生存时间 (TTL, time to live),当 key 不存在时,返回 -2 。当
key 存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key
的剩余生存时间。很明显,通过这个方法,我们很容易知道key的还剩下的生存时间,通过这个方法,可以在key过期前做点事情,但是光有这个方法还不行,我们需要确保只有进程执行,而不是所有的进程都做,正好用到下面这个方法。
SETNX方法:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则SETNX
不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET) 的简写。返回值:设置成功,返回 1
。设置失败,返回 0
。通过这个方法,模拟分布式加锁,保证只有一个进程做执行,而其他的进程正常处理。结合以上Redis方法的特性,解决第五种的问题的,实例代码。…
// 变量初始化
$key = “this is key”;
$expiration = 600;
$recalculate_at = 100;
$lock_length = 20;
$data = $cache->fetch($key);
$ttl = $cache->redis->ttl($key);
if($recalculate_at>=$ttl&&$r->setnx("lock:".$key,true)){
$r->expire(“lock:”.$key, $lock_length);
$db = new Wk_DB();
$data = $db->getXXX();
$cache->store($key, $expiration, $value);
}
原文:http://www.cnblogs.com/2881064178dinfeng/p/7219199.html
php 回调cache 方案,基于PHP的一种Cache回调与自动触发技术相关推荐
- 基于深度学习的CT图像肺结节自动检测技术三—肺有效区域提取
开发环境 jupyter notebook/pycharm # 肺有效区域提取 import SimpleITK from scipy import ndimage as ndi from skima ...
- Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)
概述 完整示例 pomxml增加依赖 数据库表数据Oracle 实体类 服务层 ehcache的配置文件 Spring-EhCache配置文件 单元测试 日志输出 日志分析 示例源码 概述 首先请阅读 ...
- Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置)
概述 示例 项目结构 数据库表数据Oracle 实体类 服务层 Spring配置文件 单元测试 日志输出 日志分析 示例源码 概述 Spring Cache基于注解的配置 如果不想使用注解或者由于其他 ...
- svg操纵方案 基于 D3 还是 angular?
之前还是想简单了, 现在重新写这篇.把逻辑拆分粒度的辨析,放到外面去. 问题提出:svg控制方案 基于 D3 还是 angular 根据这个,html 4种展现样式:普通的html,svg,2D ca ...
- 爱奇艺本地实时Cache方案
高并发系统离不开Cache,通过采用更多的本地Cache来提升系统吞吐量和稳定性是必然的,这其中的最大难点就是解决分布式本地Cache数据的实时性和一致性问题,否则本地Cache就无法更普遍应用于频繁 ...
- 数据中台建设方案-基于大数据平台(下)
数据中台建设方案 -基于大数据平台(下) 1数据中台建设方案 1.1 总体建设方案 1.2大数据集成平台 1.3大数据计算平台 1.3.1数据计算层建设
- 数据中台建设方案-基于大数据平台
数据中台建设方案 -基于大数据平台- 1 数据中台建设方案 1.1 总体建设方案 通过对客户大数据应用平台服务需求的理解,根据建设目标.设计原则的多方面考虑,建议采用星环科技Transwarp Dat ...
- 数据中台建设方案-基于大数据平台(上)
数据中台建设方案 -基于大数据平台(上) 1 数据中台建设方案 1.1 总体建设方案 通过对客户大数据应用平台服务需求的理解,根据建设目标.设计原则的多方面考虑,建议采用星环科技Transwarp D ...
- 酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智慧酒厂酒业IP广播设计指南
酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智酒业酒厂IP广播系统设计指南 由北京海特伟业任洪卓发布于2023年4月25日 一.酒厂酒业IP网络广播系统建设需求 随着中国经济的快速稳步发展 ...
- 4路组相连cache设计_移动图形处理器的纹理Cache设计
随着手机.PAD等移动设备进一步普及,对3D图形绘制的需求也越来越大.桌面GPU相较于移动GPU,其渲染流程简单直接.数据吞吐率高,进而带宽需求高,功耗大.文献[1]指出相比于集成电路按照摩尔定律的发 ...
最新文章
- 开发可统计单词个数的Android驱动程序(2)
- Python拼接多张图片
- 计算机中的 marshal 是什么意思?(列集:将数据从某种格式存为流格式的操作)(序列化)(marshalling、unmarshalling散集)
- php中angular,Angular是什么
- MSSQL返回季度开始月和某月是第几季度
- win10此电脑不见了_教程 | win10总提示“你要允许此应用对电脑的修改吗”,如何关闭?...
- 她说程序员不懂浪漫,生日宴上惨变单身狗,其实,程序员的浪漫你不懂!
- 获得Local IP Address (C++实现)
- 恕我直言,你完全没有把IDEA的Diagram功能发挥出来...
- st7789 旋转_ESP32驱动ST7789液晶屏
- echarts地图数据与世界地图中英文转换
- python3.6从入门到精通mobi_Python 3.6零基础入门与实战epub
- 电子公文技术获得突破 方正CEB渐成标准
- 全球与中国中型徒步鞋市场深度研究分析报告
- 渲染函数render
- SecureCRT连接及配置
- mysql升级后乱码_mysql 升级引起的乱码问题,今天终于解决了。。。。
- 浅谈共享软件如何不被暴力蹂躏
- python打印日历_python输出指定月份日历的方法
- ajax上传图片java6,java ajax上传图片返回json数
热门文章
- 【优化算法】动态粒子群算法的动态环境寻优算法【含Matlab源码 1125期】
- 【数字信号调制】基于matlab二进制数字相位调制(2PSK)【含Matlab源码 1000期】
- 【图像分割】基于matlab GUI阙值+边缘检测+区域法图像分割【含Matlab源码 817期】
- 【图像分割】基于matlab粒子群优化指数熵图像分割【含Matlab源码 287期】
- 阿里ai布局开始_如何从AI开始?
- pytorch torchvision的版本对应关系 pytorch历史版本
- linux git 撤销删除文件,git 撤销回滚学习
- webgl天空盒边界缝隙_WebGL three.js进修笔记 法向量网格材质MeshNormalMaterial的引见和建立360度全景天空盒的要领...
- mysql lvs+keepalived+mha_MHA+Lvs+Keepalived实现MySQL的高可用及读负载均衡_2(MySQL)
- 计算机版权转让公司,著作权转让