基于资源的HTTP Cache的实现介绍
浏览:2805次 出处信息
一、什么是HTTP Cache
对于浏览器的这种网页缓存机制大家已经耳熟能详了,举个例子来说,JavaEye的新闻订阅地址:http://www.javaeye.com/rss/news , 当浏览器或者订阅程序访问这个URL地址的时候,JavaEye的服务器在response的header里面会发送给浏览器如下状态标识:
以下是代码片段: Etag "427fe7b6442f2096dff4f92339305444" Last-Modified Fri, 04 Sep 2009 05:55:43 GMT |
以下是代码片段: def news fresh_when(:last_modified => News.last.created_at, :etag => News.last) end |
以上只是一个最简单的例子,如果我们需要根据状态做一些更多的工作也是很容易的。比方说JavaEye博客的RSS订阅地址: http://robbin.javaeye.com/rss
以下是代码片段: def board @topics = @forum.topics.paginate... @announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions => ... render :action => ’show’ end |
添加HTTP Cache以后,代码如下:
以下是代码片段: def board @topics = @forum.topics.paginate... if logged_in? || stale?(:last_modified => @topics[0].last_post.created_at, :etag => @topics.collect{|t| {t.id => t.posts_count}}.hash) @announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions... render :action => ’show’ end end |
论坛帖子页面实际上也可以使用HTTP Cache,只不过Etag的hash算法稍微复杂一些,需要保证帖子的任何改动都要引起hash值的改变,示例代码如下:
以下是代码片段: def show @topic = Topic.find params[:id] user_session.update_....... if logged_in? Topic.increment_counter(...) if ...... @posts = @topic.post_by_page params[:page] posts_hash = @posts.collect{|p| {p.id => p.modified_at}}.hash topic_hash = @topic.forum_id + @topic.sys_tag_id.to_i + @topic.title.hash + @topic.status_flag.hash ad_hash = ... (广告的hash算法,略) if logged_in? || stale?(:etag => [posts_hash, topic_hash, ad_hash]) render end end |
要分别根据主题贴,该分页的所有回帖和帖子页面的广告内容进行hash,计算出来一个唯一的Etag值,保证任何改动都会生成新的Etag,这样就搞定了,是不是很简单!这种帖子的缓存非常有效,可以避免Rails去render页面和下载页面,极大的减轻了服务器负载和带宽。
再举一个需求比较特殊的例子:对于知识库搜索相关文章的推荐页面,比方说:http://www.javaeye.com/wiki/topic/462476,也就是本文的相关文章推荐内容,我们并不希望用户和爬虫每次访问这个页面都实际执行一遍全文检索,然后构造页面内容,在一个相对不长的时间范围内,这篇文章的相关推荐文章改变的概率不大,因此我们希望比方说5天之内,用户重复访问该页面,就直接返回304 Not Modified,那么Rails没有直接的设施给我们使用,需要我们稍微了解一些Rails的机制,自己编写,代码示例如下:
以下是代码片段: def topic @topic = Topic.find(params[:id]) unless logged_in? if request.not_modified?(5.days.ago) head :not_modified else response.last_modified = Time.now end end end |
在给JavaEye网站所有的RSS订阅输出添加了HTTP Cache以后,通过一天的观察发现,超过一半的RSS订阅请求已经被缓存了,直接返回304 Not Modified,所以效果非常明显,由于JavaEye网站每天RSS订阅的动态请求就超过了10万次,因此添加HTTP Cache可以减轻不少服务器的负担和带宽消耗。除此之外,新闻文章页面,整个论坛频道,知识库相关推荐文章页面都可以添加HTTP Cache,粗粗计算下来,JavaEye这些页面统统使用HTTP Cache以后,网站整体性能至少可以提高10%。
建议继续学习:
- QQ上传大文件为什么这么快 (阅读:12376)
- Buffer和cache的区别是什么? (阅读:6850)
- 谈冷热数据 (阅读:5854)
- Linux操作系统中内存buffer和cache的区别 (阅读:5329)
- PHP处理Etag、lastModified和Expires (阅读:5136)
- 学习:一个并发的Cache (阅读:5043)
- 关于Linux的文件系统cache (阅读:4848)
- Twitter架构图(cache篇) (阅读:4798)
- 7个示例科普CPU Cache (阅读:4209)
- 详解MyISAM Key Cache(前篇) (阅读:4089)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:互联网网站的反爬虫策略浅析
后一篇:大型网站的Lucene应用 >>
文章信息
- 作者:robbin 来源: robbin的自言自语
- 标签: Cache etag
- 发布时间:2009-10-31 22:46:40
建议继续学习
近3天十大热文
- [69] Twitter/微博客的学习摘要
- [64] find命令的一点注意事项
- [64] 如何拿下简短的域名
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [63] android 开发入门
- [62] Go Reflect 性能
- [61] 流程管理与用户研究
- [59] Oracle MTS模式下 进程地址与会话信
- [58] 读书笔记-壹百度:百度十年千倍的29条法则
- [58] 图书馆的世界纪录