Web应用开发中无处不在的Cache

本文详细介绍了通过浏览器缓存、CDN、DNS服务器、缓存系统、服务器加速、数据库查询缓存、Web服务器缓存模块、内存数据存储等12种方法来优化网站性能的技术策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1.浏览器端的Cache,浏览器第一次请求某个url的时候,服务器端的Response发送给浏览器ETag及Last-Modified的http header,下次再次请求此url时,Request会带上If-None-Match及If-Modified-Since的http header给服务器端,服务器端对这两个值比较一下,如果相同,则直接返回给浏览器304 Not Modified,这样可以节省带宽。详情请看基于资源的HTTP Cache的实现介绍

2.为了提高不同地区不同用户的页面响应速度,可以采用付费的CDN或自身架设CDN,同时可以考虑使用智能DNS解析,使用BGP多线接入,解决南北网络互通的问题。

3.为了提高域名的解析速度,公司可以自身架设DNS服务器,例如像百度,Google、新浪、土豆、优酷、阿里巴巴、淘宝、大众点评网等公司都架设了自己的DNS服务器。

4.可以用Squid或Varnish缓存图片、css、js、静态页面及动态页面,并给这些页面设置失效时间,加上Expires及Last-Modified头即可,以免数据失效后Squid从真实的Web Server中去获取最新的数据。

5.在动态页面中,可以使用MemcachedMemcachedb等相关的系统来缓存页面中的一些动态数据,也可以直接用基于文件的Cache缓存一些数据,要比直接连接MySQL查询数据库要快一些,因为从MySQL取得数据需要经过socket连接、解析SQL、从磁盘取数据等一系列操作。

例如Facebook大概有400多台Memcached服务器,超过5TB 的数据在Memcached中,有可能是世界上最大的Memcached集群。

6.如果服务器端语言用的是PHP,则可以用APC、XCache、eAccelerator等来加速PHP的执行,例如Facebook使用的是APC。同时可以使用PHP内置的shared memory function /IPC功能。

7.如果服务器端用的是PHP,则可以用$GLOBALS['xxx']缓存一些数据,例如1.php及2.php同时要包含文件3.php,同时1.php包含2.php,下面的函数cache_get位于3.php中,且1.php及2.php分别调用了函数chche_get,且传递给cache_get的参数均一样,则第二次执行时直接执行函数cache_get中的第一个if分支,因为第一次调用函数cache_get时已经为全局变量赋了值,这就是使用$GLOBALS的用处。

function cache_get($id, $key, $apc=false) {
 if (isset($GLOBALS['CACHE']["$key:$id"])) {
  $cache = $GLOBALS['CACHE']["$key:$id"]));
  $hit = 1;
 } elseif ($apc && (($cache = apc_fetch("$key:$id")) !==
 false) {
  $hit = 1;
 } else {
  ... // fetch from memcached
 if ($apc) apc_store("$key:$id", $cache);
 }
  if ($hit) $GLOBALS['CACHE']["$key:$id"] = $cache;
  return $hit ? $cache : NULL;
}

8.如果数据库使用的是MySQL,则可以使用MySQL Query Cache功能,主要的是原理主将sql语句的查询缓存在内存中,对于以查询为主且很少更新的应用,Query Cache 还是很有用的,如果数据更新频率很大,则Query Cache用处不大,因为只要某个表的数据有更新,则与这个表的所有Cache将全部无效,所以得看情况是否使用这个功能。一个被频繁更新的表如果被应用了QC,可能会加重数据库的负担,而不是减轻负担。比较好的做法是默认打开QC,而对一些涉及频繁更新的表的SQL语句加上SQL_NO_CACHE关键词来对其禁用CACHE。这样可以尽可能避免不必要的内存操作,尽可能保持内存的连续性。
详细可以看
Query Cache,看上去很美这儿

或者使用MySQL的HEAP表,也就是将表中的数据保存内存中,系统重启后数据会丢失。

9.如果Web服务器用的是Apache,可以使用mod_cache缓存模块。你可以使用mod_disk_cache和mod_mem_cache来分别提供基于磁盘的缓存和基于内存的缓存,详情请看Apache Module mod_cache

10.如果Web服务器用的是Lighttpd,则可以使用modcache模块

modcache的工作原理与Squid类似,但是据说mocache比Squid更快更高效,因为mocache是基于强大的Lighttpd,同时支持将缓存数据保存在内存中。
ModCache is a cache accelerator plugin for lighttpd, which works like Squid with similar configuration. However modcache is faster and more effective than Squid because of powerful Lighttpd.
详细参见
这儿

11.如果Web服务器用的是Nginx,则可以使用ncache,ncache是由新浪开发的一款基于nginx的缓存系统,比Squid更快更高效,同时支持将缓存数据保存在内存中。
详细参见
这儿这儿

12.如果服务器使用的是linux,则可以将数据保存在/dev/shm中(例如将Squid的缓存目录及php的session目录设置为/dev/shm下面的某个子目录),也就是tmpfs,详细请看tmpfs的应用。或者用RAMDISK,所谓RAMDISK,实际上是把系统内存划出一部分当作硬盘使用,详细看给你的Linux装备Ramdisk飚一下!,不过采用这两种方式时数据是保存在内存中的,如果想持久保存这些在内存中的数据,可以写个脚本在系统关机或重启的时候转存到硬盘中。

还有34条网站加速方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值