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

概念
缓存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,每次副本的标签都会变化。    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值