转自
http://blog.csdn.net/zandershi/article/details/2989131
在Web网站中,css/js/image等静态文件不仅占用大量的网络带宽,而且给服务器端的CPU和IO系统带来极大的负载,是影响服务器吞吐量的重要因素。要解决这个问题,一个有效办法是在客户端对静态文件进行缓存。缓存有可能会导致静态文件不能在客户端即时更新,而某些网站恰恰需要客户端的js/css等缓存文件必须即时更新,否则会对用户体验带来影响。在Web 2.0时代,这更是一个不容忽视的问题。
那么,怎么样才能实现即减少网络流量和服务器负载,又能在必要时即时更新客户端缓存的目的呢?
启用客户端缓存
在HTTP/1.0的年代,可以通过设置HTTP头中的Expires字段来告诉浏览器缓存的有效时间。但这个时间是在服务器端生成,在客户端检验,因此如果服务器和客户端的时间不同步,那就有可能产生问题。此外,在有效时间截止之前,浏览器会直接使用本地缓存内容,不会与服务器沟通以检测文件是否更新,因此会导致更新不即时的情况。
HTTP/1.1协议引入了Cache-Control这个新的HTTP头字段,以浏览器访问服务器时的时间为基准,用相对于这个基准的时间来作为缓存应该失效的时间,这就解决了服务器和客户端时间不同步有可能产生的问题。在缓存失效后,
缓存失效后的文件内容验证
一旦设定的缓存失效时间已到,那么浏览器就需要向服务器发出请求,来验证服务器端的内容是否确实做了修改。
在HTTP/1.0年代,验证是通过Last-Modified这个HTTP头字段,根据文件的最后修改时间来判断的。但Last-Modified的最小时间单位是秒,所以如果文件的修改发生在一秒钟之内,那么这种机制就起不到效果了。
为了解决这个问题,HTTP/1.1协议引入了E-TAG字段,可以自定义文件修改的标志。Apache中的E-TAG默认设定为根据inode、文件大小、最后修改时间来确定。
进行验证时,浏览器把文件的上一次修改时间或者E-TAG值发送给服务器,服务器根据这个值来判断浏览器的缓存是否需要更新。如果需要更新,那么把文件的内容发送给浏览器,否则只发送304头,表示文件为修改。
缓存内容的即时更新
有些网站可能会要求客户端缓存的js/css/image文件能够即时更新,即一旦服务器端的文件做了修改,客户端在下次访问时就能获得更新,而不需要等缓存失效。
一个简单的方法是给每个静态文件加上后缀,比如是最后修改时间作为后缀,那么对一个abc.jpg文件的引用可能就变成http://www.xxx.com/image/abc.jpg?v=1221109171。手工生成这个后缀比较麻烦,如果网站使用脚本语言编程,那么可以把引用静态文件的HTML脚本改为动态编程语言,比如,把<img src="/image/abc.jpg /> 改为<?php echo show_image('/image/abc.jpg')?>, 而show_image这个PHP函数可以定义成:
function show_image($img){
return '<img src="'.$img.filemtime(WEB_ROOT.'/image/'.$img) . '"./>'
}
总结
至此,我们实现了较好的客户端缓存,能够在必要时即时地更新缓存。如果不需要更新缓存,那么在缓存失效前,没有不必要的客户端与服务器之间的连接请求;在缓存失效后,如果文件的真实内容未发生改变,服务器只需要返回304头,最大限度地减少了网络流量。
分享到:
相关推荐
- **即时生成**:用户请求时即时生成静态页面,结合缓存策略,平衡性能和资源消耗。 6. **挑战与注意事项** - **内容更新问题**:静态化后,更新内容需要同步更新静态页面,否则可能出现旧内容被访问的情况。 - ...
最后,作者强调,这种使用Filter来给静态资源URL添加时间戳的方法,在开发阶段尤其有用,可以有效避免由于缓存导致的资源更新问题,确保开发过程中的每次修改都能即时反映到客户端。然而,这种方法并不是没有缺点,...
处理程序通常会发送改变的表名、更改类型以及可选的行ID给客户端,以便客户端能相应地更新缓存。 要使用“数据库更改通知”,必须确保OE用户拥有必要的权限,包括CHANGE NOTIFICATION和EXECUTE ON DBMS_CHANGE_...
3. **缓存管理**:类可能包含对缓存的处理,以便在内容未更新时重用已生成的静态页,避免不必要的重复生成。 4. **URL重写**:为了保持动态URL的友好性,类可能会实现URL重写功能,使得静态页面的URL与动态页面看...
RMI是分布式计算的核心组件,它使得Java应用能够跨越网络边界,像调用本地对象一样调用远程对象,极大地提高了程序的可扩展性和灵活性。 在RMI中,有两种主要的注册方式:动态注册和静态注册。 **动态注册**: ...
- **缓存优化**:设置适当的缓存策略,提高文件访问速度。 - **负载均衡**:在高访问量的情况下,可以考虑使用负载均衡技术分散请求。 - **脚本支持**:某些HTTP文件服务器支持脚本编程,可以自定义功能,如动态...
4. **按需生成(On-Demand Generation)**:也称为“即时静态”或“懒加载”,只在用户访问某个页面时才生成对应的静态页面,这样可以减少存储和维护大量静态页面的成本。例如,GitHub Pages就支持这样的功能。 5. ...
- `public`或`static`: 前端静态资源,如HTML、CSS和JavaScript文件,用于实现用户界面和WebSocket客户端。 - `pom.xml`或`build.gradle`: 项目构建文件,定义了项目依赖和构建过程。 在开发这样的系统时,开发者...
在【描述】中,"能生成静态页面" 指的是网站的部分或全部内容在服务器端预先渲染成HTML文件,然后发送给客户端浏览器。这样做的好处包括更快的加载速度,因为浏览器不再需要解析复杂的脚本语言,以及减轻服务器负载...
陌陌客户端是一款在中国广受欢迎的社交应用程序,以其独特的地理位置为基础,让用户可以发现身边的新朋友,参与各种兴趣群组,进行文字和表情聊天等互动。在分析这个“仿momo客户端部分功能”的项目时,我们可以从...
8. **WebSockets**:实现实时通信,例如即时库存更新、购物车同步,提升用户交互体验。 9. **Service Worker**:可以缓存资源,实现离线访问,并对网络请求进行拦截和修改,优化性能和用户体验。 10. **...
静态生成技术通常有两种方式:一是实时生成,即在用户请求时,根据动态数据即时生成静态页面;二是预渲染,即在系统空闲时或定期生成全部或部分页面。这种技术可以结合缓存策略,如Memcached或Redis,进一步提高效率...
Java的WebSocket协议是实现Web即时通讯的一种高效方式,它提供了全双工的通信通道,允许服务器主动向客户端推送数据,使得信息传递更加实时。 WebQQ的即时通讯功能还涉及到消息队列和数据库设计。消息队列如...
Web资源管理是.NET开发中的重要环节,涉及到静态文件(如CSS、JavaScript)的组织、合并、压缩以及缓存控制等多个方面。AssetManager for .NET通过整合SignalR和NodeJS,为.NET开发者提供了更为高效且灵活的解决方案...
即时通讯(Instant Messaging, IM)软件允许用户实时在线聊天,发送文件,以及进行音视频通话。在ASP.NET中实现即时通讯,通常会用到WebSocket或SignalR等技术。WebSocket提供双向通信,使得服务器可以主动向客户端...
在安卓应用开发中,工具类(Utils)是程序员经常使用的辅助模块,它们提供了一系列静态方法,帮助处理常见的任务,如屏幕适配、键盘输入管理、数据缓存等。本压缩包包含了一些与这些主题相关的工具类,对于安卓...
3. `runtime`:运行时生成的缓存、日志等文件。 4. `vendor`:Composer管理的第三方库,如layui、workerman等。 5. `config`:系统配置文件,包括数据库配置、workerman配置等。 6. `logs`:工作日志存放处,方便...
- 静态链接和C级性能:Go编译出的二进制文件可以直接运行,无需依赖外部库,执行效率高。 2. **Gin框架** Gin是一个基于Gorilla Mux的高性能Web框架,它提供了快速开发Web应用的能力。Gin使用中间件链来处理HTTP...
至于文件"zeit-now-desktop-14c14ea",这个名字暗示可能使用了Zeit Now服务,这是一个云托管平台,支持快速部署和自动优化静态网站和服务器渲染应用。Zeit Now可以提供按需扩展的服务器资源,确保《时代周刊》客户端...