这是我在Ruby Tuesday上分享的记录,介绍Rails缓存的使用方法
Two Big Problems
There are only two hard problems in Computer Science: cache invalidation and naming things. – Phil Karlton
Fortunately, Rails has made it perfect!
启用缓存
默认development模式禁用缓存,production环境启用缓存
1
|
|
缓存核心:Rails.cache
3种基本操作
读
Rails.cache.write 'foo', 'bar'
写
Rails.cache.read 'foo'
不存在则写,存在则读
Rails.cache.fetch 'a_big_data' do { (1..1000000).inject(:+) }
缓存默认是以文件形式保存,文件位置
./tmp/cache
缓存原理
1 2 3 4 5 |
|
缓存策略
Rails.cache
- Fragment caching
- Action caching
- Page caching
- HTTP caching
Fragment Caching
1 2 3 4 5 6 7 8 9 10 11 |
|
手动设置过期
1 2 |
|
Fragment Caching 效果
Fragment Caching key生成策略
1 2 3 4 5 6 |
|
Action Caching
1 2 |
|
Page Caching
1
|
|
特点:
* 很快但无用
* 第一次访问时会在public
目录生成静态html结尾文件,此后访问就会跳过所有validation和filter。
HTTP Caching
报文头:
1
|
|
示例:
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 9 10 |
|
特点:
- 如果没有修改,直接返回304,不需要返回网页内容
- 最有效的缓存方式
- 工作在协议层,更快
- 使用HTTP头(Last-Modified, ETag, If-Modified-Since, If-None-Match, Cache-Control)
Tips
- 别碰swapper,除非非它不可。
- 为所有缓存使用自动过期的key。
- 经常把
belongs to
和:touch => true
结合使用 - 使用
Rails.cache
来缓存查询到的数据 - 在每次部署应用后不要忘记设置ENV[‘RAILS_APP_VERSION’]
- 一定要缓存你的assets静态文件。
- 缓存粒度一定要小,以此提高命中率
Thanks to
http://www.broadcastingadam.com/2012/07/advanced_caching_revised/