`
andyhu1007
  • 浏览: 199472 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Rails每周一题(四): Browser Cache

阅读更多

注意,这里讲的是浏览器端的cache。关于Rails服务器端的cache,以后专门开题再讲。

 

HTTP协议对Cache 的支持

 

总而言之,cache机制是为了减少发送request的次数(过期模型),还有就是减少发送整个response的机会以减少网络带宽的使用(验证模型)。

 

在HTTP协议里面,主要有三种控制cache的方式。

 

1. Cache-Control

 

Cache-Control有一系列的指令来告诉应该对cache采取怎样的处理,比如no-cache, no-store, max-age, must- revalidate等。Cache-Control也是唯一的显式指令。其它模式,比如过期模型和验证模型,都是隐式地告诉应该怎样处理cache。

 

Cache-Control有很多不同的指令。如果有明显的冲突,一般采用最严格的解释方式。

 

2. 过期模型(Expiration Model)

 

应用了过期模型,在设定的过期时限之前,不会向服务器发起真正的request,而是直接返回cache。

 

这种方式一般用在一些静态页面很多,或者基本上在一段时间内不会改变的页面上。比如google的主页一般在几个礼拜内都不会变化。

 

服务端通过Expires头或者Cache-Control的max-age指令来设定过期时间(后者的优先级更高,如果同时指定,后者覆盖前者)。

 

3. 验证模型(Validation Model)

 

当cache有一个旧的entry,想用它作为一个客户端请求的response时,它需要检查cache的entry是否仍可用(这里不是基于应用了过期模型的cache方式,而是默认cache方式)。这就是验证模型。

 

服务器端会进行验证,如果验证确实match,则返回304(Not Modified)状态码,但不会返回entity-body。否则则返回整个response(包括entity-body)。

 

验证模型可以使用时间、checksum等来进行验证。跟验证模型相关的指令有:last-modifed, if-modified-since, ETag, if-none-match等。


对于这三种模式在冲突时的优先级关系,我没有很好地去分析。但通过某些行为可以看出,Expire优先于Validation,而某些Cache-Control指令又能把Expires或者Validation干掉。

 

现代web服务器和浏览器对Cache的支持

 

用firebug跟踪了一下,发现现在的web服务器(即使是Mongrel)和浏览器对cache的工作做得相当好。对于如css,javascript,image等文件,都会自动采取验证模型来进行cache。

 

比如第一次对一个静态文件进行访问时,response header包含这样一个值:

 

Last-Modified	Wed, 25 Mar 2009 15:07:30 GMT
Etag"49ca48b2-1faca-140dbf"

 

后续的请求头里面会有如下一些值:

 

If-Modified-Since	Wed, 25 Mar 2009 15:07:30 GMT
If-None-Match	"49ca48b2-1faca-140dbf"
Cache-Control	max-age=0

 

相应的response status code是304(Not Modified),且response header变成:

 

Connection	close
Date	Mon, 06 Apr 2009 09:32:46 GMT
Etag	"49ca48b2-1faca-140dbf"

 

 

Rails对动态页面cache的支持

 

http://guides.rubyonrails.org/caching_with_rails.html 的Conditional GET support部分。

 

 

Rails鼓励我们采取怎样的cache方式

 

Rails会默认为javascript,css,image等资源文件的path后面附加上文件的最后修改时间。为啥要这么做?很明显,Rails是在鼓励你使用过期模型去cache这些资源文件。

 

比如在Apache里,使用这样的配置来使这些静态资源文件被cache。

     ExpiresActive On
     <FilesMatch "\.(ico|gif|jpe?g|png|js|css)$">
          ExpiresDefault "access plus 1 year"
     </FilesMatch>
 

添加了这个配置之后。对js等文件请求的reponse头里面就会多了如下两个header。

 

Cache-Control	max-age=31536000
Expires	Tue, 06 Apr 2010 09:28:49 GMT
 

在随后的请求中,只要文件还没过期,客户端就不需要再去发起request获取被Cache的资源。同时,一旦文件有任何改变,浏览器都能获取到新的文件。因为path已经根据最后修改时间改变。

 

唯一值得注意的是,因为浏览器限制对同一个地址一般最多同时发起两个请求,所以我们会使用了多台资源服务器(查看AssetTagHelper Doc 了解怎样使用多台资源服务器),那么保证每台服务器时间的同步是至关重要的。不然会因为资源服务器的随机选择,url后附着的时间戳经常改变,致使cache失效。

 

Cache的两条简单规则

 

对于现在的网站应用来说,我很同意以下的两条cache原则。

 

Don't cache HTML

 

1. Use Cache-Control: no-cache for dynamic HTML pages

2. Use the Last-Modified header with the current file time for static HTML

 

Cache everything else forever

 

1. For all other file types set an Expires header to the maximum future date your web server will allow

2. Modify URLs by appending a query string in your HTML to any page element you wish to ‘expire’ immediately.

 

结束!

分享到:
评论

相关推荐

    Rails的精简版本Rails::API.zip

    Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...

    rails-cache-extended:帮助程序和日志记录添加到 Rails 缓存

    Rails::Cache::Extended 这允许为记录集合生成自动过期的缓存键 安装 将此行添加到应用程序的 Gemfile 中: gem 'rails-cache-extended' 然后执行: $ bundle 或者自己安装: $ gem install rails-cache-...

    ROR绿色最新环境(2013/3/10)

    Rails::Rack::Logger ActionDispatch::ShowExceptions ActionDispatch::DebugExceptions ActionDispatch::RemoteIp ActionDispatch::Reloader ActionDispatch::Callbacks ActiveRecord::ConnectionAdapters::...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...

    Ruby on Rails入门例子

    Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本篇将通过一个入门实例,深入探讨Rails的基本概念和核心...

    rails-ansible-presentation:有关Rails + Ansible的Deckset演示

    [适合] Rails :red_heart: Ansible [适合] Rails :red_heart: Ansible (有一点帮助) Rails部署 简单吧? 将应用程序放在服务器上。 捆绑宝石。 应用迁移。 重新启动服务。 Easy Rails部署 git push master ...

    rails-basic-template:基本 Rails 模板

    Rails 基本模板参考: : Ruby on Rails Gemfile:定义应用程序正在使用的库的文件bundle install:基于Gemfile,安装所有库每次修改 Gemfile 时都应该运行bundle install gem 是 Ruby 的库RubyGems.org 是一个查找和...

    rails_console_toolkit:可配置的 Rails 控制台助手

    RailsConsole 工具包 :wrench: :toolbox: 可配置的 Rails 控制台助手更快地查找记录,添加自定义助手,将您的控制台寿命提高 100%。安装将此行添加到应用程序的 Gemfile 中: gem 'rails_console_toolkit' 然后生成...

    rails_email_preview:在Rails中预览和编辑应用程序邮件模板

    安装加 到Gemfile: gem 'rails_email_preview' , '~&gt; 2.2.2' 添加一个初始化程序和路由: $ rails g rails_email_preview:install 在app / mailer_previews /中生成预览类和方法存根$ rails g rails_email_preview:...

    Ruby on Rails入门经典代码

    Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...

    webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成.zip

    webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成 不再维护webpack-rails 不再被维护。 有关详细信息,请参阅 #90. web pack-railsweb pack 为你提供了将 web pack集成到现有的Ruby on Rails 应用程序中...

    rails-developer-scanning:针对Rails开发人员的自动面试问题

    标题 "rails-developer-scanning" 指向的是一个针对Rails开发者设计的自动化面试工具,旨在帮助面试官或招聘者快速有效地评估应聘者的Rails技能。这个工具名为 "jyaasa_interviewer",通过RubyGem安装,使得面试过程...

    rails-cache-inspector:用于片段缓存的可视化调试的简单工具

    安装将此行添加到应用程序的Gemfile中: gem 'rails-cache-inspector' , group : :development用法配置突出显示 # config/initializers/rails_cache_inspector.rbRailsCacheInspector . configuration . highlight_...

    Ruby On Rails 面试系列七,一个面试练习题

    这个面试练习题可能是为了测试应聘者对于Rails应用的构建、自动化任务管理、测试驱动开发(TDD)以及文件组织结构的理解。让我们逐一探讨这些知识点。 首先,`Rakefile`是Ruby中的构建工具,类似于其他语言的...

    rails-dom-testing:从ActionView中提取DomAssertions和SelectorAssertions

    Rails :: Dom :: Testing 这个gem负责比较HTML DOM并断言Rails应用程序中存在DOM元素。 assert_dom_equal通过assert_dom_equal和assert_dom_not_equal进行比较。 元素通过assert_dom , assert_dom_encoded , ...

    Agile Web Development with Rails 4th edition(敏捷Web开发与Rails:程序指南 第四版)

    《敏捷Web开发与Rails:程序指南 第四版》是一本深度探讨使用Ruby on Rails框架进行敏捷Web应用开发的专业书籍。本书旨在帮助开发者充分利用Rails 4的特性,提高开发效率,实现快速迭代和高质量的代码编写。 Rails是...

    rails-controller-testing:将`assigns`和`assert_template`带回到您的Rails测试中

    Rails :: Controller :: Testing 这个gem将assigns给控制器测试的内容以及assert_template带回assigns控制器和集成测试的内容。 这些方法已中。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-...

    rails_stack-cookbook:使用 nginx、unicorn、redis 等设置 Rails 环境的 Chef 食谱

    rails_stack 食谱 TODO:在此处输入食谱说明。 例如,这本食谱使您最喜欢的早餐三明治。 要求 TODO:列出您的食谱要求。 确保包含本说明书对平台、库、其他说明书、软件包、操作系统等的任何要求。 例如 包裹 ...

    rails-docker-compose:Ruby on Rails的Docker开发环境

    使用Docker开发Ruby on Rails的配置文件 docker-compose up 利润! 你得到什么 一线开发环境的设置和启动: docker-compose up 。 一个易于安装的依赖关系可在新计算机上进行编码:Docker。 (与使用Vagrant时的两...

    Rails Cache

    Rails Cache 是 Ruby on Rails 框架中的一个核心特性,用于提升Web应用的性能,通过缓存数据减少数据库查询,从而加快页面加载速度。在高并发环境下,缓存机制显得尤为重要,因为它能显著降低服务器压力。本文将深入...

Global site tag (gtag.js) - Google Analytics