高性能web网站中的缓存
开发一个高性能的web服务,缓存是必不可少的。缓存是万金油,下面介绍下我们web服务中用到了哪些缓存
1、前端缓存
对于静态资源,有三种方式。
- 根据last modified time,询问web server是否有更新,若not modified,则让浏览器使用本地缓存
- 根据etag标识,web server对比浏览器传过来的etag与服务器计算出的etag,若不同则返回最新的内容给浏览器。使用etag优于使用last modified time机制,毕竟基于内容算出来的标记更为靠谱。
- 根据expire标识,若max-age大于0,则可以使用本地缓存,完全不用请求web server
2、cdn
前端项目中依赖的资源(js,css等),在打包后会自动上传到cdn上,从而加速用户访问。
cnd是由分布在不同区域的边缘节点服务器群组成的分布式网络,替代传统以WEB Server为中心的数据传输模式。将用户的请求分配至最适合他的节点,使用户可以以最快的速度取得他所需的内容,有效解决Internet网络拥塞状况,提高用户访问的响应速度。
3、vanish本地缓存
项目中使用了varnish作为本地缓存。使用vanish将对读性能要求较高的配置类接口进行缓存(必须是get接口,并且响应的httpcode为200)。vanish在后端机器上监听8081端口,访问后端服务时,需要指定proxy为127.0.0.1:8081当本地vanish中缓存未过期时,读取缓存内容后直接返回。当缓存满时,vanish会根据LRU机制,把最旧的object释放掉。
4、redis 分布式缓存
使用varnish,可以在不侵入代码的情况下,缓存住大量读的接口。而在某些情况下,需要使用redis这种分布式缓存,在多台机器之间缓存数据。redis提供了丰富的数据结构与查询接口,事实上redis也是我们使用比较多的缓存之一。 但如果缓存的某个数据过大,例如几十MB,反复读取也会造成redis性能的下降。
5、apcu 进程间缓存
php5.5以后,opcache将代替apc做为php加速的位置,也就是代替其系统缓存的位置。并将用户缓存功能独立出来,开启新的组件,这个组件名称叫做apcu。使用时需要安装,并且在ini文件中加上apc.enabled=on打开。
apcu 使用共享内存机制,可以在同一台server的不同进程间缓存数据。apcu将数据缓存在内存中,相比redis等分布式缓存,省去了网络io的时间,性能会更好。 但apcu对缓存内存大小有要求。
public static function get($key, $fun, $ttl)
{
if (!static::$isOpen || $ttl == 0) {
return call_user_func($fun);
}
if (apcu_exists($key)) {
return apcu_fetch($key);
}
$data = call_user_func($fun);
if ($data) {
apcu_store($key, $data, $ttl);
}
return $data;
}
6、变量static缓存
在函数内将变量声明为static,在一次连接中可反复使用。速度快,效率高,实现简单
7、opcache缓存
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache的目地是避免重复编译,减少CPU和内存开销。
8、mysql查询缓存
MySQL查询缓存可以跳过SQL解析优化查询等阶段,直接返回缓存结果给用户。当然前提比较苛刻,需要两次查询环境与sql完全一样