【问题标题】:rails active record caching in memory在内存中缓存活动记录
【发布时间】:2013-12-04 08:42:17
【问题描述】:

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

我玩过自己按 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() 或类似的方式,以使关联代理使用我的缓存?

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

(请注意,此过程不涉及Web前端。都是模型和ORM)

【问题讨论】:

    标签: ruby-on-rails caching


    【解决方案1】:

    尝试使用IdentityCache(请参阅https://github.com/Shopify/identity_cache)。我们目前有一个类似的问题。我们使用 JRuby 是因为它快速,但 malloc 在我们的目标环境中成本很高……因此缓存这些记录实例变得更加必要。

    ActiveRecord 中曾经有一个IdentityMap,但由于与关联相关的意外行为问题,它已被删除。

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

    【讨论】:

    • 我最终构建了自己的缓存系统。我认为我查看了 Identity Cache,这不是我想要的,但我不记得确切的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2012-04-17
    • 2012-07-31
    • 2012-07-09
    • 2013-05-27
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多