1. 认识缓存
缓存:
原意是指可以进行高速数据交换的存储器。当cpu处理数据时,先到cache中寻找,如果数据已经读取,就不需要去RAM中读取了
在web开发中,缓存主要应用在以下几个方面,PHP为例:
- 底层有cpu缓存,磁盘文件系统缓存
- 应用层有zend虚拟机变量缓存,有memcached这样的key-value内存缓存
- 数据库层有Table cache, thread cache, query cache
- servlet容器层有Apache的缓存
- 浏览器缓存
这些缓存都是存放在内存或者硬盘中。一般的情况是需要速度的话存在内存中,需要持久性和数据量比较大时用硬盘缓存。
命中率:
指请求缓存次数与缓存返回正确结果次数的比例。
缓存最大数据量:
能处理的元素最大个数或能使用的最大存储空间
缓存更新策略(缓存内存满后,就会剔除老的缓存)
- FIFO (first in first out)最先进入缓存的数据最先被清理出去
- LFU (less frequently used) 最少是用的元素会被清理掉。需要换存有hit属性
- LRU (least recently used) 最近最少使用的元素被清理。需要有时间戳。
2. 缓存实例
-- Opcode缓存:
一个php程序运行完后,内存马上释放,基本所有数据都被销毁,此时内存不存在php代码中的数据,这和常住内存的java等语言有显著区别。
优点: 有效避免内存泄露,内存回收机制简单。避免因为一个程序而连累整个服务器。
缺点: 无法服用已有数据,每个请求都重复执行 请求--翻译--执行 过程
opcode(operation code)缓存就是虚拟机吧php代码编译成一种中间码的结果缓存起来(硬盘或内存)。下一次运行到此页面,直接解释这些代码就行了。省去Flex语法其进行语法编译和大部分语法检查
-- MySQL缓存
Mysql实例: Querycache 缓存客户端提交给mysql的select语句的结果集。 就是把select语句和结果做hash映射后保存在一定的内存区域内
-- 客户端缓存
由浏览器来实现的,将浏览器在硬盘中存储已经看过的网页副本。
如果URL相同,缓存直接使用副本相应访问,而不用向服务器发送请求
缓存内容应用情形:
- 有完整的过期时间和寿命控制头,并且没过期。 就是在expires和cache-control中的max-age值
- 浏览器已经使用过缓存副本,并且在一个会话中检查过过期时间。例如后退,前进
- 如果缓存太旧了,会向服务器发送校验请求。如果资源不变,则返回304,内容为空
内容整理自 《php核心技术与最佳实践》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。