- 浏览: 648325 次
- 性别:
- 来自: Shanghai
文章分类
最新评论
-
107x:
不错,谢谢!
Vim多行缩进技巧 -
can007:
EC2是不负责储存???
体验Amazon EC2 -
vanxining:
书名是什么呢?
Neural Network依然不是理想的AI -
贾懂凯:
缩进的标准是tab,linux默认tab=8。在不同的平台会出 ...
Vim多行缩进技巧 -
edison0951:
貌似他的老师是波谱尔吧,和黑天鹅讲的东西差不多
索罗斯与因果论
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设计方案很容易因业务逻辑变化而作废。
这让我想到了现在流行的集中式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就没法利用这种方式了。
集群文件系统完全不懂,应该比内存集群要慢得多巴?
这让我想到了现在流行的集中式cache方案memcached,调用者“只须失效”某个影响到的缓存即可,至于cluster环境中如何处理,则完全不必要关心。
对于page cache页面来说,如果某个业务方法的执行导致该page cache应当更新,那删除该页面的工作交由该业务方法来处理。至于删除本节点之后其他节点如何自动删除(同理:生成该节点中的page cache,其他节点自动生成),应当交给其他支撑技术来实现,比如集群文件系统。(我本人并未实施过,纯属纸上谈兵)
linux集群文件系统
http://linux.ccidnet.com/pub/html/tech/jiqun/index.htm
这本来就是rails的url重写方法。问题是怎么“只须删除”?如果是定期的设个cron刷新各节点还简单。如果是不定期刷新的,理论上需要一个同步程序,当一个节点的page cache刷新的时候去删掉其它节点的过期page 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规则也挺好用,
实际是可以解决的:
http://www.kreny.com/docs/apache2.0/misc/rewriteguide.html
引用
最后在集群环境,为了避免节点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完成)。
说明:
这是一个很难解的功能:动态生成的静态页面,即,它应该作为静态页面发送(从文件系统中读出,然后直接发出去),但是如果它丢失了,则由服务器动态生成。如此,可以静态地提供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规则也挺好用,
实际是可以解决的:
http://www.kreny.com/docs/apache2.0/misc/rewriteguide.html
引用
最后在集群环境,为了避免节点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完成)。
说明:
这是一个很难解的功能:动态生成的静态页面,即,它应该作为静态页面发送(从文件系统中读出,然后直接发出去),但是如果它丢失了,则由服务器动态生成。如此,可以静态地提供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
没办法,草稿还算以前的时间,只好自己顶一下咯。
发表评论
-
对Django的遗憾
2006-11-08 12:18 17135对django的错失良机我一直觉得很遗憾。我去年大概10月的时 ... -
Rails目前的一些局限
2006-11-08 12:17 2695robbin前面提到了一些局限,如遗留数据库是约定造成的,可以 ... -
Need for Speed
2006-11-06 07:38 6338Erb的渲染一直有人说慢,而c版本的eruby始终没有和Rai ... -
Ruby yield释疑
2006-11-01 03:10 4167context switch不足以表明coroutine,一般 ... -
Passing Parameters to before_filter
2006-10-30 07:23 2003I've just noticed that before_f ... -
ROR: the disruptive innovation
2006-09-29 22:13 1643I happen to read about a great ... -
Farewell, Java
2005-11-20 15:34 1890Evaluation: moving from Java t ... -
Try Ruby
2005-12-22 20:34 1745I'm systematically learning Rub ... -
10 Things Every Java Programmer Should Know About Ruby
2005-12-29 01:35 1668Happened to find this wonderful ... -
Heading fast on Rails~
2006-03-24 00:14 1518Not to mention the recent two S ... -
Ruby小窍门3则
2006-10-29 11:16 2654*怎么转16进制? class Integer de ... -
Ruby的根模块命名空间
2006-10-24 05:30 6832如果你要定制Rails的违例输出页面的话的,一般会用这样的代码 ... -
加强版irb
2006-10-20 11:48 10319Ruby的irb和Unix shell一样,通过定制可以提供更 ... -
rake test:units在SQL和Ruby DSL两种schema模式下的差异
2006-10-10 01:16 2300sql方式,会复制development数据库中的外键。相反, ... -
有奖竞猜
2006-10-02 05:51 5043如下代码,第一位正确说出它的功能的我会给4星评价,第一个发现其 ... -
Ruby简化属性声明与初始化
2006-09-27 00:57 2730如果要一边声明一边初始化可以用这样的代码: class O ... -
Ruby和Python的语法差别
2006-09-25 18:35 23231布娃娃在另一个帖子提 ... -
Ruby惯用法
2006-09-19 20:41 23613Ruby有不少惯用法,这里略作一些介绍,也方便阅读他人代码: ... -
对Robbin《ruby on rails为什么暂时无法成为企业应用开发的主流?》的一些思考
2006-09-17 20:19 2350对Rails开发方式我也在思考,对动态类型和meta prog ... -
RJS经验点滴
2006-09-14 14:54 2473所见即所得方式的问卷设计器终于搞定了,一些细节体会: * 任何 ...
相关推荐
- **基于Rails Cache的封装**:尽管简单,但能有效地实现对象缓存的自动化管理,适用于简单的场景。 #### 七、总结 构建高性能Web应用的缓存架构是一个系统工程,涉及到多个层面的技术选择和实现细节。通过对上述...
SecondLevelCache是一个受Cache Money和cache_fu启发的直写式和直读式缓存库,支持ActiveRecord 4,ActiveRecord 5和ActiveRecord 6。 直读:按ID进行的查询,例如current_user.articles.find(params[:id]) ,...
书中会介绍如何通过缓存(如Action Cache和Page Cache)、数据库查询优化、资产管道优化等手段提升应用性能。 2. **复杂的路由**:Rails的路由系统允许灵活地定义资源和URL结构。高级Rails会讲解如何创建更复杂的...
安装将此行添加到应用程序的Gemfile中: gem 'rails-cache-inspector' , group : :development用法配置突出显示 # config/initializers/rails_cache_inspector.rbRailsCacheInspector . configuration . highlight_...
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 这允许为记录集合生成自动过期的缓存键 安装 将此行添加到应用程序的 Gemfile 中: gem 'rails-cache-extended' 然后执行: $ bundle 或者自己安装: $ gem install rails-cache-...
在使用Rails基准测试器时,可以指定不同的选项来进行性能测试,例如通过-perf选项来启用或覆盖默认的日志记录级别,通过-nocache选项关闭Rails缓存以排除缓存对测试结果的影响,以及通过-path选项来指定测试脚本的...
10. 性能优化:使用缓存(如Rails的Page Cache、Action Cache)、数据库索引、资产打包(如Webpacker或Sprockets)等技术提高网站性能。 在这个项目中,文件夹`master_rails_by_actions-master`可能包含了整个商城...
然后在控制器中使用 `cache_page` 方法来缓存特定的动作响应,如 `cache_page @post`。 2. **页面缓存的局限性**:不是所有页面都适合使用页面缓存。如果页面内容根据用户身份或行为动态变化,例如登录状态、个人...
Ruby on Rails 的 Redis 存储redis-rails为Ruby on Rails提供全套存储(Cache、Session、HTTP Cache)。请参阅redis-store 主自述文件以了解一般准则。关于 Rails 5.2 的简要说明Rails 5.2.0包含一个开箱即用的 ...
3. **数据缓存**:使用低级缓存`Rails.cache`存储查询结果,避免重复计算。 三、代码优化 1. **避免在循环中进行数据库查询**:将查询移到循环之外,减少不必要的数据库交互。 2. **减少视图复杂性**:保持视图...
12. **缓存**:利用Rails的缓存机制,如Action Cache、Fragment Cache和低级别的Redis或Memcached,减少数据库查询,提高响应速度。 13. **部署与持续集成(CI/CD)**:使用Heroku、Capistrano等工具进行部署,配合...
然而,Rails 4.0中引入了Page Cache和Fragment Cache作为替代方案,这是因为Action Cache在某些情况下可能会导致复杂的缓存管理和失效问题。Page Cache(也称为Action Controller Caching)将整个页面的HTML直接缓存...
模型缓存ModelCache 是一个简单的 Rails 缓存插件,使用memcached 。 它为您的模型提供缓存功能,允许: 基于通用键(ActiveRecord cache_key在幕后添加)在模型实例方法中缓存代码块缓存您的实例方法,可选择使用...
9. **性能优化**:通过缓存策略(如Action Cache和Page Cache)、负载均衡和预热等方式提升Rails应用的性能。 10. **日志和监控**:配置日志管理和监控工具(如Lograge和New Relic),以便追踪应用性能和错误。 11...
- **性能优化**:提高了数据库查询性能,并引入了ActiveRecord Query Cache来缓存查询结果。 - **简化代码**:去除了许多不再使用的功能,使代码更加简洁。 #### 二、Rails 4开发环境搭建 - **安装Ruby**:推荐...