$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回调与自动触发技术相关推荐

  1. 基于深度学习的CT图像肺结节自动检测技术三—肺有效区域提取

    开发环境 jupyter notebook/pycharm # 肺有效区域提取 import SimpleITK from scipy import ndimage as ndi from skima ...

  2. Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)

    概述 完整示例 pomxml增加依赖 数据库表数据Oracle 实体类 服务层 ehcache的配置文件 Spring-EhCache配置文件 单元测试 日志输出 日志分析 示例源码 概述 首先请阅读 ...

  3. Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置)

    概述 示例 项目结构 数据库表数据Oracle 实体类 服务层 Spring配置文件 单元测试 日志输出 日志分析 示例源码 概述 Spring Cache基于注解的配置 如果不想使用注解或者由于其他 ...

  4. svg操纵方案 基于 D3 还是 angular?

    之前还是想简单了, 现在重新写这篇.把逻辑拆分粒度的辨析,放到外面去. 问题提出:svg控制方案 基于 D3 还是 angular 根据这个,html 4种展现样式:普通的html,svg,2D ca ...

  5. 爱奇艺本地实时Cache方案

    高并发系统离不开Cache,通过采用更多的本地Cache来提升系统吞吐量和稳定性是必然的,这其中的最大难点就是解决分布式本地Cache数据的实时性和一致性问题,否则本地Cache就无法更普遍应用于频繁 ...

  6. 数据中台建设方案-基于大数据平台(下)

    数据中台建设方案 -基于大数据平台(下) 1数据中台建设方案 1.1 总体建设方案 1.2大数据集成平台 1.3大数据计算平台 1.3.1数据计算层建设

  7. 数据中台建设方案-基于大数据平台

    数据中台建设方案 -基于大数据平台- 1 数据中台建设方案 1.1 总体建设方案 通过对客户大数据应用平台服务需求的理解,根据建设目标.设计原则的多方面考虑,建议采用星环科技Transwarp Dat ...

  8. 数据中台建设方案-基于大数据平台(上)

    数据中台建设方案 -基于大数据平台(上) 1 数据中台建设方案 1.1 总体建设方案 通过对客户大数据应用平台服务需求的理解,根据建设目标.设计原则的多方面考虑,建议采用星环科技Transwarp D ...

  9. 酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智慧酒厂酒业IP广播设计指南

    酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智酒业酒厂IP广播系统设计指南 由北京海特伟业任洪卓发布于2023年4月25日 一.酒厂酒业IP网络广播系统建设需求 随着中国经济的快速稳步发展 ...

  10. 4路组相连cache设计_移动图形处理器的纹理Cache设计

    随着手机.PAD等移动设备进一步普及,对3D图形绘制的需求也越来越大.桌面GPU相较于移动GPU,其渲染流程简单直接.数据吞吐率高,进而带宽需求高,功耗大.文献[1]指出相比于集成电路按照摩尔定律的发 ...

最新文章

  1. 开发可统计单词个数的Android驱动程序(2)
  2. Python拼接多张图片
  3. 计算机中的 marshal 是什么意思?(列集:将数据从某种格式存为流格式的操作)(序列化)(marshalling、unmarshalling散集)
  4. php中angular,Angular是什么
  5. MSSQL返回季度开始月和某月是第几季度
  6. win10此电脑不见了_教程 | win10总提示“你要允许此应用对电脑的修改吗”,如何关闭?...
  7. 她说程序员不懂浪漫,生日宴上惨变单身狗,其实,程序员的浪漫你不懂!
  8. 获得Local IP Address (C++实现)
  9. 恕我直言,你完全没有把IDEA的Diagram功能发挥出来...
  10. st7789 旋转_ESP32驱动ST7789液晶屏
  11. echarts地图数据与世界地图中英文转换
  12. python3.6从入门到精通mobi_Python 3.6零基础入门与实战epub
  13. 电子公文技术获得突破 方正CEB渐成标准
  14. 全球与中国中型徒步鞋市场深度研究分析报告
  15. 渲染函数render
  16. SecureCRT连接及配置
  17. mysql升级后乱码_mysql 升级引起的乱码问题,今天终于解决了。。。。
  18. 浅谈共享软件如何不被暴力蹂躏
  19. python打印日历_python输出指定月份日历的方法
  20. ajax上传图片java6,java ajax上传图片返回json数

热门文章

  1. 【优化算法】动态粒子群算法的动态环境寻优算法【含Matlab源码 1125期】
  2. 【数字信号调制】基于matlab二进制数字相位调制(2PSK)【含Matlab源码 1000期】
  3. 【图像分割】基于matlab GUI阙值+边缘检测+区域法图像分割【含Matlab源码 817期】
  4. 【图像分割】基于matlab粒子群优化指数熵图像分割【含Matlab源码 287期】
  5. 阿里ai布局开始_如何从AI开始?
  6. pytorch torchvision的版本对应关系 pytorch历史版本
  7. linux git 撤销删除文件,git 撤销回滚学习
  8. webgl天空盒边界缝隙_WebGL three.js进修笔记 法向量网格材质MeshNormalMaterial的引见和建立360度全景天空盒的要领...
  9. mysql lvs+keepalived+mha_MHA+Lvs+Keepalived实现MySQL的高可用及读负载均衡_2(MySQL)
  10. 计算机版权转让公司,著作权转让