概念
缓存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,每次副本的标签都会变化。