rails在内存中激活记录缓存

时间:2013-08-08 19:44:13

标签: ruby-on-rails caching

我有一个模型通过两个外键关系与另一个模型建立关系。我在导入大量数据时对这些表(3-4K行)进行了大量查找,并且我正在尝试消除虚假的重复数据库查找。 (理想情况下,我的数据库只会执行异步写入/ INSERT)

我玩ID自己做了自己的缓存,最近切换到使用Rails.cache(现在使用MemoryStore。我不需要与其他实例同步,而且我在导入机器上很富有)。但是,我发现我得到了相同记录的多个副本,我想摆脱它。

例如:

irb> p = Phone.includes([:site => :client, :btn => :client]).first. 

irb> p.site.client.object_id => 67190640 

irb> p.btn.client.object_id => 67170780

理想情况下,我希望这些指向内存中的同一个对象。 Rails.cache将序列化进/出,这实际上只是让事情变得更糟,但我对此感到惊讶。我可以用关联代理使用我的缓存的方式覆盖find_by_id()或其他一些东西吗?

也许我还缺少另一个缓存模块?

(请注意,此过程中没有涉及网络前端。这是所有型号和ORM)

1 个答案:

答案 0 :(得分:1)

尝试使用IdentityCache(请参阅https://github.com/Shopify/identity_cache)。我们目前有类似的问题。我们正在使用JRuby,因为它是 fast ,但malloc在我们的目标环境中很昂贵...更加需要缓存这些记录实例。

ActiveRecord中曾经有IdentityMap,但由于关联期间出现意外行为问题而被删除。

刚刚注意到你在8月问了这个问题,你找到了一个好的解决方案吗?