- 浏览: 335698 次
- 性别:
- 来自: 北京
文章分类
最新评论
Identity Map是Rails3.1的又一个新特性。
一、什么是Identity Map
下面的代码是ActiveRecord在未开启Identify Map时的表现:
上面的user和same_user是都是id为1的User对象,但是却是两个对象。
下面开启Identity Map:
当ActiveRecord开启了Identity Map后,每一个model会维持一个Map,每次实例化对象之前会通过主键去这个model对应的Map里找到对应的对象。如果存在,直接从Map里返回这个对象,否则才进行查询,实例化对象后放到Map里。
二、和Query Cache/Cache Money的差别
听起来和ActiveRecord的query cache或是cache money类似。实际上差别蛮大的:
从减少db查询方面和query cache一样,缓存池是在一次请求结束后销毁。各个请求之间不共享,而cache money是全局的,缓存结果可以被持续利用。
query cache是根据sql来做主键,而identity map和cache money是根据model的主键。
Identity Map还具有减少内存使用和保持一致性的作用。
三、Identity Map的优点
1.一致性:一个model对象保持完全唯一的引用,避免了更新同一个对象时候产生的不一致现象。
下面的例子是未开启Identity Map时,同一条记录的num被两次增加1,但是结果只增加了1.造成最终结果和实际不一致。而开启了Identity Map的结果最终是正确的。
2.节省内存:不会重复创建相同的对象。
3.提高速度:和ActiveRecord的query cache一样,减少db hits
四、存在的问题
目前默认还是未开启的。因为最近发现的在处理关联时的问题:
ps:rails 3.1的rails console默认可以打印sql日志,不需要hack irbrc了,cool~
一、什么是Identity Map
引用
Identity Map is a design pattern that:
Ensures that each object gets loaded only once by keeping every loaded object in a map. Looks up objects using the map when referring to them.
http://www.martinfowler.com/eaaCatalog/identityMap.html
Ensures that each object gets loaded only once by keeping every loaded object in a map. Looks up objects using the map when referring to them.
http://www.martinfowler.com/eaaCatalog/identityMap.html
下面的代码是ActiveRecord在未开启Identify Map时的表现:
>> user = User.first User Load (0.3ms) SELECT "users".* FROM "users" LIMIT 1 >> same_user = User.find 1 User Load (11.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] >> user == same_user => true >> user.object_id == same_user.object_id => false
上面的user和same_user是都是id为1的User对象,但是却是两个对象。
下面开启Identity Map:
>> ActiveRecord::IdentityMap.enabled = true >> user = User.first User Load (0.4ms) SELECT "users".* FROM "users" LIMIT 1 >> same_user = User.find 1 User Loaded From Identity Map (id: 1) >> user == same_user => true >> user.object_id == same_user.object_id => true
当ActiveRecord开启了Identity Map后,每一个model会维持一个Map,每次实例化对象之前会通过主键去这个model对应的Map里找到对应的对象。如果存在,直接从Map里返回这个对象,否则才进行查询,实例化对象后放到Map里。
二、和Query Cache/Cache Money的差别
听起来和ActiveRecord的query cache或是cache money类似。实际上差别蛮大的:
从减少db查询方面和query cache一样,缓存池是在一次请求结束后销毁。各个请求之间不共享,而cache money是全局的,缓存结果可以被持续利用。
query cache是根据sql来做主键,而identity map和cache money是根据model的主键。
Identity Map还具有减少内存使用和保持一致性的作用。
三、Identity Map的优点
1.一致性:一个model对象保持完全唯一的引用,避免了更新同一个对象时候产生的不一致现象。
下面的例子是未开启Identity Map时,同一条记录的num被两次增加1,但是结果只增加了1.造成最终结果和实际不一致。而开启了Identity Map的结果最终是正确的。
>> user = User.first User Load (0.3ms) SELECT "users".* FROM "users" LIMIT 1 >> same_user = User.find 1 User Load (12.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] >> user.num = user.num + 1 => 1 >> user.save (0.9ms) UPDATE "users" SET "updated_at" = '2011-06-12 09:46:32.722893', "num" = 1 WHERE "users"."id" = 1 => true >> same_user.num = same_user.num + 1 => 1 >> same_user.save (0.4ms) UPDATE "users" SET "updated_at" = '2011-06-12 09:46:53.093752', "num" = 1 WHERE "users"."id" = 1 => true >> user.reload => #<User id: 1, name: nil, num: 1, created_at: "2011-06-12 03:00:30", updated_at: "2011-06-12 09:46:53">#这里结果不一致了 >> ActiveRecord::IdentityMap.enabled = true => true >> same_user = User.find 1 User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] => #<User id: 1, name: nil, num: 1, created_at: "2011-06-12 03:00:30", updated_at: "2011-06-12 09:46:53"> >> user = User.first User Load (0.3ms) SELECT "users".* FROM "users" LIMIT 1 User Loaded From Identity Map (id: 1) => #<User id: 1, name: nil, num: 1, created_at: "2011-06-12 03:00:30", updated_at: "2011-06-12 09:46:53"> >> same_user.num = same_user.num + 1 => 2 >> same_user.save (0.4ms) UPDATE "users" SET "updated_at" = '2011-06-12 09:51:59.203676', "num" = 2 WHERE "users"."id" = 1 >> user.num = user.num + 1 => 3 >> user.save (0.5ms) UPDATE "users" SET "updated_at" = '2011-06-12 09:52:21.643577', "num" = 3 WHERE "users"."id" = 1 #加了两次1结果为3,正确!
2.节省内存:不会重复创建相同的对象。
3.提高速度:和ActiveRecord的query cache一样,减少db hits
四、存在的问题
目前默认还是未开启的。因为最近发现的在处理关联时的问题:
# Active Record Identity Map does not track associations yet. For example: # comment = @post.comments.first # comment.post = nil # @post.comments.include?(comment) #=> true # # Ideally, the example above would return false, removing the comment object from the # post association when the association is nullified. This may cause side effects, as # in the situation below, if Identity Map is enabled: # # Post.has_many :comments, :dependent => :destroy # # comment = @post.comments.first # comment.post = nil # comment.save # Post.destroy(@post.id) # # Without using Identity Map, the code above will destroy the @post object leaving # the comment object intact. However, once we enable Identity Map, the post loaded # by Post.destroy is exactly the same object as the object @post. As the object @post # still has the comment object in @post.comments, once Identity Map is enabled, the # comment object will be accidently removed. # # This inconsistency is meant to be fixed in future Rails releases.
ps:rails 3.1的rails console默认可以打印sql日志,不需要hack irbrc了,cool~
发表评论
-
新博客
2012-04-23 20:47 1747https://db-china.org -
Ruby Verbose Warning Mode
2011-10-16 14:48 2054Ruby在很多方面是一个更优雅的Perl,从Perl社区继承了 ... -
Pattern Match In Ruby
2011-10-07 01:17 2009最近看了一些Erlang,模式匹配是个好东西,简单的sum函数 ... -
Draper: View Models for Rails
2011-10-07 01:19 2271Draper是一个Ruby gem,它让Rails model ... -
Active Record batch processing in parallel processes
2011-10-07 01:20 2272Active Record 提供 find_each来分批处理 ... -
最轻量级的Ruby后台任务
2011-08-04 16:47 3863普通情况下ruby调用系统命令行的过程是堵塞的,无论是用sys ... -
test
2011-07-15 19:59 0test -
fiber
2011-06-17 09:37 0挖坑,待填。。 1.用到fiber.alive?、fiber ... -
xx00
2011-06-06 03:40 0https://github.com/ngmoco/cache ... -
挖坑1
2011-06-06 02:17 0cache money 源码 替换memcache为redis ... -
websocket demo
2011-06-04 20:44 2057地址:https://github.com/hooopo/we ... -
ruby GC
2011-06-02 04:24 0http://blog.csdn.net/lijun84/a ... -
reduce method missing call stack with dynamic define method
2011-04-22 22:54 1595method_missing是ruby里面一个非常cool的h ... -
Autocompete with Trie
2011-04-09 04:04 1676像微薄里面用户输入一 ... -
用imagemagick和tesseract-ocr破解简单验证码
2011-04-09 01:31 18936工具:imagemagick + tesseract-ocr ... -
OAuth gem for rails,支持豆瓣,新浪微薄,腾讯微博,搜狐微博,网易微博
2011-03-26 03:13 4483地址:https://github.com/hooopo/oa ... -
用jmeter模拟amf请求进行压力测试
2010-12-16 16:56 30241.获取amf二进制包: 在本地建立proxy,端口为888 ... -
Memoization in Ruby
2010-11-14 11:42 1212这里的Memoization就是将ruby的方法或lambda ... -
整理了一下2008-2010的RubyHeroes博客列表
2010-10-07 02:26 2830Bryan Helmkamp(webrat作者)https:/ ... -
长期收藏各种有用gems..
2010-09-26 17:17 267Multipart Body – A gem for work ...
相关推荐
这是最新的Rails 3.1 实战,包括TDD、BDD等实用技术。
Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...
标题 "rails3.1安装与mysql配置 windows" 涉及到的是在Windows操作系统上安装Ruby on Rails 3.1框架并配置MySQL数据库的过程。这是一个关键的开发环境设置步骤,对于使用Rails进行Web开发的程序员来说至关重要。Ruby...
### 敏捷Web开发与Rails 4th Edition (Rails 3.1)——全面解析 #### 核心知识点概述 《敏捷Web开发与Rails》第四版涵盖了最新的Rails 3.1版本,是一本旨在帮助开发者快速掌握Ruby on Rails框架的核心书籍。本书...
backbone-rails, 在 Rails 3.1中轻松使用 backbone.js 主干 rails 轻松设置并使用 Rails 3.1和更高版本的backbone.js ( 1.2.2 )##Version#####Github 主 branch###gem 版本:1.2.2Backbone 版本:1.
tiny_mce, Ruby on Rails 插件( pre Rails 3.1 ),允许你轻松地将TinyMCE编辑器实现到你的应用程序中 用于 Rails的 TinyMCE因为我没有时间维护它,而且代码库处于不一致状态,所以这个 gem 被折旧 ! 似乎如下笔记。...
在Rails 3.1版本中,引入了许多重要更新和改进,使得这个框架更加高效且功能丰富。 首先,让我们深入了解Rails 3.1在资产管道(Asset Pipeline)方面的重要变革。资产管道是一种整合和优化应用程序中CSS、...
咖啡豆Rails 3.1包含了轰动。 我对能够以一种更轻松,更美观的方式编写JavaScript感到非常兴奋。 但是,当将CoffeeScript添加到Rails 3.1中时,他们忘记了一个非常重要的部分,即在响应JavaScript(JS)请求时可以...
《Rails 3 in Action》是2011年由Ryan Bigg撰写的一本关于Ruby on Rails框架的权威指南,专门针对当时最新的Rails 3.1版本进行了深入解析。这本书旨在帮助开发者充分利用Rails 3.1的强大功能,提升Web应用开发的效率...
该项目允许您在 Rails 3.1 应用程序中轻松使用 iPhone 样式的复选框。 安装 将gem 'ios-checkboxes'添加到 Gemfile 并运行bundle install 与 Rails 3.1 一起使用 将//=require ios-checkboxes添加到您的app/assets/...
利用并充分利用Rails 3.1资产管道的好处Jasminerice消除了您没有测试CoffeeScript文件无法控制的泛滥的借口。 该项目动摇并使用了MIT-LICENSE。 发展须知 布拉德·费兰(Brad Phelan)不再积极开发该项目,但正在...
为 Rails 3.1+ 资产管道提供 GitHub Flavored Markdown CSS。 安装 将这些行添加到应用程序的Gemfile : # github flavored markdown css packaged for the rails asset pipeline gem 'github-css-rails' , '~> ...
在添加同时使用,并充分利用Rails 3.1资产管道。 jasmine-stories消除了您没有测试失控应用程序的任何借口。 该项目,是的无耻“叉子”,并使用了MIT-LICENSE。 无头测试 有关详细信息,请参见。 默认情况下,将...
脚本以用于 Rails 3.1+ 和 Rails 4 资产管道。 安装 将jquery_file_download-rails添加到应用程序的Gemfile : gem 'jquery_file_download-rails' 运行 Bundler 来锁定 gem: bundle install 在jquery和jquery...
此gem打包了Rails 3.1+资产管道的 。 Eonasdan的tarruda的的分支得到了积极维护,并与。 是必需的依赖项。 安装 将这些行添加到应用程序的Gemfile中: gem 'momentjs-rails' , '>= 2.9.0' gem 'bootstrap3-...
桌布栏杆 Doc Walker 宝石化提供为 Rails 3.1+ 资产管道打包的Tablecloth JavaScript/CSS。安装将这些行添加到应用程序的Gemfile : # tablecloth table js/css packaged for the rails asset pipelinegem '...
-rails gem 将通过资产管道将库包含到您的Rails 3.1+应用程序中。 这个 gem 与来自的最后一个标记发布版本捆绑在一起,它由 Rails Assets Pipeline 自动为您缩小。 如果您需要自定义功能检测测试,请考虑本 README ...
铁轨这个 gem 只包含作为 Rails 3.1(或更高版本)资产管道中的资产。 gem 中的当前版本是 TipTip 1.3安装将 gem 添加到 Gemfile gem "tiptip-rails", "~> 1.0.0"用法在您的 JavaScript 清单中(例如application.js ...