`
cookoo
  • 浏览: 648304 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

Rails Cache

    博客分类:
  • Ruby
阅读更多
Rails提供三种页面cache方式:

action cache静态化action的结果但不会跳过filter,使用简单,麻烦最少,提速不多,一般够用。成批expire可以通过expire_fragment

fragment cache用来静态化页面的一部分。这种cache是非常基础的,被action cache在内部使用。默认使用文件系统做store,足够快,也可以改成memcache store。

完全把页面静态化的page cache能提速几十倍,效果极其明显。缺点也很明显:跳过任何filter, 无法控制访问权限。一个额外的好处是因为实际跳过了整个Rails,所以间接减少了FCGI进程数量的需求。成批expire最好在文件系统中直接删目录。

对于page cache来说,如果只有少量需要动态获取的内容,可以使用js做点变通免得这丁点部分成为瓶颈。一种办法是在window.onload的时候让js去读cookie然后再显示内容, 这个显然有安全问题。改良的办法是通过AJAX从服务器lazy load进动态部分而不拖静态部分的后腿。当然这种办法也只适合需要少量动态获取的部分,否则就没有意义了。注意page cache因为跳过了filter(实际跳过整个Rails), 所以编码方式也不能靠Rails来控制,需要设置一下web server的mime类型编码(by 老友Simon Lei)。 此外page cache是很不安全的,应避免任何需要权限的内容被page cache掉。最后在集群环境,为了避免节点cache同步问题,不得不放弃使用page cache

url参数默认是被action cache和page cache忽略的。以前有个插件可以让action cache把url参数当cache key的一部分,不过1.1.5 routing代码改过之后没用了。我以前不理解,现在总算明白了为什么core team不实现这个功能,因为就算url参数当cache key对action cache是方便,但是对page cache就麻烦了,因为page cache完全是web server负责的,需要自己配web server url重写规则,这过分复杂了, 又依赖于特定web server。还是直接配rails routing简单有效。

通常页面cache已经足够快了,但是它节约的是erb的渲染时间。在数据层,通过memcache缓存复杂的计算结果,耗时的数据查询,session读写也是很有用的。基于memcache-client库的cached_model对简单的AR查询比AR默认的cache要好很多。默认cached_model会根据model名和记录id自动对单条记录cache 15分种,对复杂查询的结果需要手动cache。AR的update也会自动刷新cache,但是通过SQL update的得自己刷新cache。

最后,Lucas Lee兄说过有钱不如多砸到硬件上面节约优化时间是蛮正确的思路。如无必要(意思是profile出瓶颈在哪里)不要过早优化。cache设计方案很容易因业务逻辑变化而作废。
分享到:
评论
7 楼 sorphi 2006-10-27  
对集群文件系统我也在学习当中,等实施过才知道:)
6 楼 cookoo 2006-10-26  
sorphi 写道
cookoo 写道
这本来就是rails的url重写方法。问题是怎么“只须删除”?如果是定期的设个cron刷新各节点还简单。如果是不定期刷新的,理论上需要一个同步程序,当一个节点的page cache刷新的时候去删掉其它节点的过期page cache。我从来没见过这样做的实例,不清楚这种方案会有什么问题或瓶颈。


这让我想到了现在流行的集中式cache方案memcached,调用者“只须失效”某个影响到的缓存即可,至于cluster环境中如何处理,则完全不必要关心。

对于page cache页面来说,如果某个业务方法的执行导致该page cache应当更新,那删除该页面的工作交由该业务方法来处理。至于删除本节点之后其他节点如何自动删除(同理:生成该节点中的page cache,其他节点自动生成),应当交给其他支撑技术来实现,比如集群文件系统。(我本人并未实施过,纯属纸上谈兵)

linux集群文件系统
http://linux.ccidnet.com/pub/html/tech/jiqun/index.htm

是啊,memcache怎么同步节点是透明的,所以现在Rails集群多用memcache当cache store,适合rails能控制的action cache和fragment cache. page cache的话,除非把web server配成能直接访问memcache(有没有这种方法未知), 否则page cache就没法利用这种方式了。

集群文件系统完全不懂,应该比内存集群要慢得多巴?
5 楼 sorphi 2006-10-26  
cookoo 写道
这本来就是rails的url重写方法。问题是怎么“只须删除”?如果是定期的设个cron刷新各节点还简单。如果是不定期刷新的,理论上需要一个同步程序,当一个节点的page cache刷新的时候去删掉其它节点的过期page cache。我从来没见过这样做的实例,不清楚这种方案会有什么问题或瓶颈。


这让我想到了现在流行的集中式cache方案memcached,调用者“只须失效”某个影响到的缓存即可,至于cluster环境中如何处理,则完全不必要关心。

对于page cache页面来说,如果某个业务方法的执行导致该page cache应当更新,那删除该页面的工作交由该业务方法来处理。至于删除本节点之后其他节点如何自动删除(同理:生成该节点中的page cache,其他节点自动生成),应当交给其他支撑技术来实现,比如集群文件系统。(我本人并未实施过,纯属纸上谈兵)

linux集群文件系统
http://linux.ccidnet.com/pub/html/tech/jiqun/index.htm
4 楼 cookoo 2006-10-26  
sorphi 写道
配置url rewrite规则也挺好用,

引用
最后在集群环境,为了避免节点cache同步问题,不得不放弃使用page cache


实际是可以解决的:

http://www.kreny.com/docs/apache2.0/misc/rewriteguide.html

引用
空闲时间内的内容协商
说明:
这是一个很难解的功能:动态生成的静态页面,即,它应该作为静态页面发送(从文件系统中读出,然后直接发出去),但是如果它丢失了,则由服务器动态生成。如此,可以静态地提供CGI生成的页面,除非有人(或者是一个cronjob)删除了这些静态页面,而且其内容可以得到更新。

方案:
以下规则集实现这个功能:
RewriteCond %{REQUEST_FILENAME}   !-s
RewriteRule ^page\.html$          page.cgi   [T=application/x-httpd-cgi,L]

这样,如果page.html不存在或者文件大小为null,则对page.html的请求会导致page.cgi的运行。其中奥妙在于,page.cgi是一个将输出写入page.html的(同时也写入STDOUT)的常规的CGI脚本,执行完毕,服务器则将page.html的内容发出。如果网管需要强制更新其内容,只须删除page.html即可(通常由一个cronjob完成)。

这本来就是rails的url重写方法。问题是怎么“只须删除”?如果是定期的设个cron刷新各节点还简单。如果是不定期刷新的,理论上需要一个同步程序,当一个节点的page cache刷新的时候去删掉其它节点的过期page cache。我从来没见过这样做的实例,不清楚这种方案会有什么问题或瓶颈。
3 楼 LucasLee 2006-10-25  
路过...突然发现楼主提到了我,荣幸,荣幸.
2 楼 sorphi 2006-10-25  
配置url rewrite规则也挺好用,

引用
最后在集群环境,为了避免节点cache同步问题,不得不放弃使用page cache


实际是可以解决的:

http://www.kreny.com/docs/apache2.0/misc/rewriteguide.html

引用
空闲时间内的内容协商
说明:
这是一个很难解的功能:动态生成的静态页面,即,它应该作为静态页面发送(从文件系统中读出,然后直接发出去),但是如果它丢失了,则由服务器动态生成。如此,可以静态地提供CGI生成的页面,除非有人(或者是一个cronjob)删除了这些静态页面,而且其内容可以得到更新。

方案:
以下规则集实现这个功能:
RewriteCond %{REQUEST_FILENAME}   !-s
RewriteRule ^page\.html$          page.cgi   [T=application/x-httpd-cgi,L]

这样,如果page.html不存在或者文件大小为null,则对page.html的请求会导致page.cgi的运行。其中奥妙在于,page.cgi是一个将输出写入page.html的(同时也写入STDOUT)的常规的CGI脚本,执行完毕,服务器则将page.html的内容发出。如果网管需要强制更新其内容,只须删除page.html即可(通常由一个cronjob完成)。
1 楼 cookoo 2006-10-25  
没办法,草稿还算以前的时间,只好自己顶一下咯。

相关推荐

    Rails缓存架构设计

    - **基于Rails Cache的封装**:尽管简单,但能有效地实现对象缓存的自动化管理,适用于简单的场景。 #### 七、总结 构建高性能Web应用的缓存架构是一个系统工程,涉及到多个层面的技术选择和实现细节。通过对上述...

    second_level_cache:受CacheMoney和cache_fu启发的直写和直读缓存库,支持ActiveRecord 4、5和6

    SecondLevelCache是​​一个受Cache Money和cache_fu启发的直写式和直读式缓存库,支持ActiveRecord 4,ActiveRecord 5和ActiveRecord 6。 直读:按ID进行的查询,例如current_user.articles.find(params[:id]) ,...

    Advanced Rails

    书中会介绍如何通过缓存(如Action Cache和Page Cache)、数据库查询优化、资产管道优化等手段提升应用性能。 2. **复杂的路由**:Rails的路由系统允许灵活地定义资源和URL结构。高级Rails会讲解如何创建更复杂的...

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

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

    Rails.Angular.Postgres.and.Bootstrap.2nd.Edition

    Cache Complex Queries Using Materialized Views Chapter 11. Asynchronously Load Data from Many Sources Chapter 12. Wrangle Forms and Validations with Angular Chapter 13. Dig Deeper Appendix A1. Full ...

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

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

    rails性能优化

    在使用Rails基准测试器时,可以指定不同的选项来进行性能测试,例如通过-perf选项来启用或覆盖默认的日志记录级别,通过-nocache选项关闭Rails缓存以排除缓存对测试结果的影响,以及通过-path选项来指定测试脚本的...

    Ruby-Rails实战之B2C商城开发

    10. 性能优化:使用缓存(如Rails的Page Cache、Action Cache)、数据库索引、资产打包(如Webpacker或Sprockets)等技术提高网站性能。 在这个项目中,文件夹`master_rails_by_actions-master`可能包含了整个商城...

    举例理解Ruby on Rails的页面缓存机制

    然后在控制器中使用 `cache_page` 方法来缓存特定的动作响应,如 `cache_page @post`。 2. **页面缓存的局限性**:不是所有页面都适合使用页面缓存。如果页面内容根据用户身份或行为动态变化,例如登录状态、个人...

    Ruby on Rails 的 Redis 存储.zip

    Ruby on Rails 的 Redis 存储redis-rails为Ruby on Rails提供全套存储(Cache、Session、HTTP Cache)。请参阅redis-store 主自述文件以了解一般准则。关于 Rails 5.2 的简要说明Rails 5.2.0包含一个开箱即用的 ...

    Complex Rails system_Rails_优化_

    3. **数据缓存**:使用低级缓存`Rails.cache`存储查询结果,避免重复计算。 三、代码优化 1. **避免在循环中进行数据库查询**:将查询移到循环之外,减少不必要的数据库交互。 2. **减少视图复杂性**:保持视图...

    Rails Best Practices

    12. **缓存**:利用Rails的缓存机制,如Action Cache、Fragment Cache和低级别的Redis或Memcached,减少数据库查询,提高响应速度。 13. **部署与持续集成(CI/CD)**:使用Heroku、Capistrano等工具进行部署,配合...

    Ruby-ActionPack的Action缓存在Rails40中从核心移除

    然而,Rails 4.0中引入了Page Cache和Fragment Cache作为替代方案,这是因为Action Cache在某些情况下可能会导致复杂的缓存管理和失效问题。Page Cache(也称为Action Controller Caching)将整个页面的HTML直接缓存...

    model_cache:用于缓存模型代码的 Rails 插件

    模型缓存ModelCache 是一个简单的 Rails 缓存插件,使用memcached 。 它为您的模型提供缓存功能,允许: 基于通用键(ActiveRecord cache_key在幕后添加)在模型实例方法中缓存代码块缓存您的实例方法,可选择使用...

    rails web server deploy guide

    9. **性能优化**:通过缓存策略(如Action Cache和Page Cache)、负载均衡和预热等方式提升Rails应用的性能。 10. **日志和监控**:配置日志管理和监控工具(如Lograge和New Relic),以便追踪应用性能和错误。 11...

    Rails 4 Application Development.pdf

    - **性能优化**:提高了数据库查询性能,并引入了ActiveRecord Query Cache来缓存查询结果。 - **简化代码**:去除了许多不再使用的功能,使代码更加简洁。 #### 二、Rails 4开发环境搭建 - **安装Ruby**:推荐...

Global site tag (gtag.js) - Google Analytics