【问题标题】:Loading Rails activerecord associations from memcache从 memcache 加载 Rails activerecord 关联
【发布时间】:2012-07-28 05:25:46
【问题描述】:

我的应用中有 2 个模型 - 一个请求和一个类别 一个请求属于一个类别。该系统包含许多请求,但只有几个类别。这些类别是静态的,永远不会改变,它们拥有其他也是静态的关联。我可以使用 memcache 来存储类别和相关的关联。

当 Rails 加载特定请求时,我如何告诉它从 memcache 而不是 DB 加载关联的类别?

req = Request.find(id)
req.category (Curr this hits the DB - want it to hit memcache)

重写方法 req.category 是唯一的方法吗?

【问题讨论】:

  • 那么你在这个问题上做了什么?

标签: ruby-on-rails activerecord memcached associations


【解决方案1】:

Memcache 是一个键/值存储,只能存储字符串,因此您必须编写一个自定义方法来检索类别以及以某种方式序列化您的对象。

看这里:What is the best way to store an ActiveRecord object in memcached?

【讨论】:

  • 感谢您的链接。但似乎我不需要为在 memcache 中缓存 AR 对象做任何特别的事情——它开箱即用。我在 Rails 3.2.2 上
【解决方案2】:

我不确定,但我认为你的解决方案没有你想象的那么好。

所以你有 20 个类别,假设你想要获取 2000 个请求。如果使用 ActiveRecord 执行此操作,您可以在两个查询中执行此操作

Request.includes(:category)

这只会命中数据库的两倍,并且如果索引正确,它应该会非常快。我刚刚用 sqLite 测试了上面的数字,我在 13.4 毫秒内得到了它,这是可以接受的。使用外键索引,我不知道为什么,但它下降到 11.3 毫秒。

如果你用 memcached 实现你的“解决方案”,我只是假设,但它实际上可能会变得更糟,因为你访问缓存的次数与你获取请求的次数一样多,所以在这个例子中你会访问 memcached 2000时间,即使它们每次花费 1 毫秒,也将是 2000 毫秒 = 2 秒。

【讨论】:

  • 当我检索多个请求时,您所说的是正确的。但是我的情况是加载单个请求时。在这种情况下,includes 不会改善这种情况,因为会有 2 个查询,而我正在寻找的是从 memcache 中检索到的请求和类别的一个查询。同样如问题中所述,类别对象包含其他嵌套对象(即它是一个沉重的静态对象)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多