最近研究了一下 rails的cache设计,发现其中一些不尽如人意的地方:
* cache expiry 编写繁琐
* 分页缓存的清除,现有cache实现的支持都不是很完善
* 在一次清除大量缓存的时候,脏数据读的问题。
我查阅了一些blog以及相关的文章,从他们的抱怨和设计中得到一些启发,我觉得cache可以做得更好,更智能,更能够减少开发人员的工作量。 下面是我设计思路的一些草稿,如果深入分析,觉得可行的话,就可以动手做他:
* 支持 cache 分组。
* 支持简化的expiry rules
* 适当的设计减少一次清除大量缓存时脏数据读的概率和时间窗
* 仅考虑memcache的支持。
* 尽可能在现有框架的基础上做简单的扩展,减少开发量。
支持cache 分组可以同时带来很多好处,第一,支持分页缓存的一次expire。同时也有利于“减少脏数据读的时间窗”,cache分组的设计是整个设计的关键思路之一。下面来谈谈cache分组的设计:
* 内存开辟一个hash。key是group ID。value是一个特有的Group对象,这个Group对象的设计目的是
尽可能简便并且尽快地 清除同一组的所有cache key。
* 要expire 同组所有脏缓存数据,有两种策略: 1) 按照cacheKey 逐一清楚 2) 不清除,而是加版本号
第一种策略意味着需要保存Group和 CacheKey的一对多关系,这个保存可能需要通过数据库来保存,带来的复杂和性能开销似乎不是上选。
第二种策略不用清除缓存,也不用查询数据库。但这种策略也需要做一些工作,在加入缓存的时候,我们需要修改原有的cacheKey,在后面加上Version=1这样版本标识。get cache的时候
也需要做同样的工作。当expire脏Group的时候,只需要将Group对象上的version属性递增一。原有的脏数据通过memcache的自动清理策略来自动清除。
从这个分析来看,我觉得选择第二种策略更好。
整个smart_cache的设计实现应该在现有的cache实现的基础上,通过alias_method(rails的AOP)加入我们自己的中间逻辑。这样开发量最少。
设计中的另外一个关键点是 expiry rules的设计,目前rails cache的expire的编写已经比较简单了,我们只需要更进一步,初步
设计如下,在config目录下增加一个 cache_expiry_rules.rb,示例代码如下:
SmartCache::Rules do |config|
config.add_rule(:group=>"user list",:expire_rules=>[cud_rule(User,Department,Room),rule(User.update*)])
config.add_rule(:group=>"department list",:expire_rules=>[cud_rule(Department,Room),rule(Department.update*)])
end
上面代码中的关键部分:
:expire_rules=>[cud_rule(User,Department,Room),rule(User.update*)])
其中,cud表示某个model对象上的create,update,delete方法完成后。
后面的rule(user.update*) 表示UserModel上的符合规则的某些方法被调用了之后。
原有的缓存的方法 cache 需要最后增加一个属性 :group=>"your group",比如 cache fragment 的编写
<% cache :controller="user",:action=>"list",:page=>"params[:page]",:group=>"user list" do %>
//rhtml code here to renderring view
<% end %>
caches_action :list, :show,:group="test group"
参考文章:
* web agile devel....
*
http://www.railsenvy.com/2007/2/28/rails-caching-tutorial
*
http://blog.leetsoft.com/2007/5/22/the-secret-to-memcached
*
http://blog.craigambrose.com/past/2007/11/13/caching_makes_your_brain_explode/
*
http://cfis.savagexi.com/articles/2007/09/05/rails-unusual-architecture
.............
分享到:
相关推荐
安装将此行添加到应用程序的Gemfile中: gem 'rails-cache-inspector' , group : :development用法配置突出显示 # config/initializers/rails_cache_inspector.rbRailsCacheInspector . configuration . highlight_...
Rails Cache 博文链接:https://mmm.iteye.com/blog/134696
RailsAdmin - 一个Rails引擎,提供了一个易于使用的界面来管理您的数据
入门rails的第一个demo
一个Rails应用程序,为DIY小型内容分发网络CDN提供支持
Rails::Cache::Extended 这允许为记录集合生成自动过期的缓存键 安装 将此行添加到应用程序的 Gemfile 中: gem 'rails-cache-extended' 然后执行: $ bundle 或者自己安装: $ gem install rails-cache-...
简介 Ruby On Rails 框架自它提出之日...Rails 是一个真正彻底的 MVC(Model-View-Controller) 框架,Rails 清楚地将你的模型的代码与你的控制器的应用逻辑从 View 代码中分离出来。Rails 开发人员很少或者可能从未遇到
GoOnRails: 一个Rails生成器用于生成Go代码并集成Go APIs至一个Rails app中
字体配制文件 博文链接:https://babo.iteye.com/blog/72298
Acl9 一个基于角色的授权系统,提供了一个简洁的DSL来保护你的Rails应用程序
shoppe-example, 在 Rails 中使用Shoppe平台的示例存储实现 这是一个 Rails 应用程序,它使用 Shoppe 构建。 它具有一个可以爱的设计,以充分演示Shoppe平台提供的功能以及它在 Rails 应用程序中的。 正在启动要开始...
一个Rails引擎,提供工作流程的基本基础设施。 它基于Workflow Nets。
chef-rails, 厨房设置一个可以与 Nginx 和 Rails 一起滚动的Ubuntu服务器 主厨 rails安装一个准备为 Ruby on Rails 栈准备的Ubuntu服务器:NginxPostgreSQLRedisMemcached带RVM的rubyPhusion乘客独立要求Ubuntu ...
一个用Ruby on Rails搭建的图片分享的网站项目.完整源代码
rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails ...