缓存详解-核心技术与最佳实践

2/10/2017来源:ASP.NET技巧人气:353

概念
缓存cache:高速数据交换存储器。RAM。 加大吞吐量:减少计算量,缩短请求流程(减少网络I/O,硬盘I/O) php应用缓存: 1、底层CPU缓存、磁盘文件系统缓存。 2、应用层Zend虚拟机的变量缓存,有memcached key-value内存缓存, APC,eaccelerator这类基于opcode字节码的缓存。 3、数据库层有table cache,thread cache,query cache. 4、servlet容器层有apache的缓存。 5、servlet再上去,在web cache层(squid,varnish) memcache偏向于缓存,追求速度和性能。mongodb偏向于数据库,数据类型丰富。
三要素
命中率:请求缓存次数和缓存返回正确结果次数的比例。MySQL:query cache. show global status查看global status. 缓存更新策略: FIFO:先进先出; LFU:less frequently used最少使用元素会被清理掉。 LRU:least recently used最近最少使用的元素会被清理掉。 缓存最大数据量: 缓存中处理元素最大个数或者能使用的最大存储空间。mysql query_cache_szie

文件缓存

存储磁盘、容量大,磁盘比内存更稳定。SSD固态硬盘读写速度提升。 扩展容易:磁盘阵列、分布式处理等。 web应用中的模板引擎和配置文件的处理中
应用
模板作用之一:把php代码编译成静态HTML文件,下次读取不用再编译,直接读取静态文件。 <?php /*返回编译文件的文件名*/ public function path() { return $this->cache_file = $this->arrayConfig['cachedir'].$this->file.$this->arrayConfig['suffix_cache']; } /** * 开始编译 */ public function compile() { $this->message = ob_get_contents(); @file_put_contents($this->path(), $this->message); } /** * 显示模板 */ public function show($file) { $this->file = $file; $PIG_TPL_FILE = $this->arrayConfig['templateDir'].$file.$this->arrayConfig['suffix']; //先判断缓存文件是否存在 if(is_file($this->path())){ $old = $_SERVER['REQUEST_TIME'] - filemtime($this->path()) >= $this->arrayConfig['cache_time']? 1 : 0; }else{ $old = 0; } //如果需要静态编译 if(true == $this->arrayConfig['cache_htm']){ if(is_file($this->path()) && !$old){ readfile($this->path());//静态编译文件存在并且没有过期 }else{ if(is_file($PIG_TPL_FILE)){ ob_start(); extract($this->value); include($PIG_TPL_FILE);//否则重新编译 $this->compile(); }else{ die('找不到模板文件'); } } }else{//不需要编译 if(is_file($PIG_TPL_FILE)) { extract($this->value); include($PIG_TPL_FILE);//加载原始文件并保存 }else{ die('找不到模板文件:'.$PIG_TPL_FILE); } } }
相关缓存产品
文件缓存开源产品secache:shopex团队开发。 纯PHP实现,无须扩展;使用LRU算法自动清理;最大支持1G缓存;使用hash定位,读取迅速; 模仿的是memcached存储机制,KEY-VALUE二进制数据库,使用hash索引方式进行快速查找到相关的文件中的位置,并且采用拉链法解决冲突。 使用slab数据块来存储数据。 (文件存储体积较大的数据。数据库存储数据同步和锁问题) opcode缓存:虚拟机把PHP代码编译成一种中间码的结果缓存起来(硬盘/内存),下次运行就不用再编译直接解释即可。 eaccelerator:常驻内存。就是其中的一种opcode缓存,在服务器第一次请求PHP文件时候,会对PHP文件的opcode进行缓存;再次请求直接读取opcode; 由zend虚拟机直接执行,从而节省了语法解析的消耗。 eaccelerator缓存opcode,同时提供一组API来操作缓存数据,java中的共享变量。 能使得变量在不同的进程中得到共享。 eaccelerator_put/eaccelerator_get

客户端缓存

web缓存:由浏览器实现,同一个回话过程中,检查一次病确定缓存的副本足够新。
遵循规则
1、如果响应头告诉浏览器不需要保留缓存,缓存器就不会缓存响应内容。 2、如果请求信息需要认证或者安全加密,相关内容也不会进行缓存。 3、如果在回应中不存在校验器。 4、含有完整的过期时间和寿命控制头信息
头部信息
expires:过期时间,告诉缓存器相关副本的过期时间。 cache-control:缓存控制 etag:服务器生成的唯一标识符etag,每次副本的标签都会变化。