2012-07-28 69 views
0

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

如何在导轨加载特定请求以从memcache加载相关类别而不是数据库时告诉导轨?

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

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

+0

那么你在这个问题上做了什么? – 2012-07-29 01:31:51

回答

0

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

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

+0

感谢您的链接。但似乎我并不需要做任何特殊的事情来缓存memcache中的一个AR对象 - 它可以直接使用。我在Rails 3.2.2 – 2012-07-29 04:05:12

0

我不知道,但我认为您的解决方案并不像你想象的那么好。

因此,你有20个类别,并可以说2000个你想获取的请求。如果用ActiveRecord做它,你可以在两个查询

Request.includes(:category) 

这将只命中了两次数据库,并用正确的索引应该是相当快的做到这一点。我刚刚用sqLite测试了上面的数字,我在13.4ms得到了它,这是可以接受的。有了外键的索引,我不知道为什么,但它下降到11.3毫秒。

如果你用memcached实现你的“解决方案”,我只是假设,但实际上它可能会变得更糟,因为你会像请求获取一样多次访问缓存,所以在这个例子中,你会碰到memcached 2000次,即使它们每次需要1ms,它也会是2000ms = 2s。

+0

你说什么是正确的,当我检索多个请求。但是,我的情况是加载单个请求时。在这种情况下,include将不会改善这种情况,因为会有2个查询,我在寻找的是从memcache中检索到的请求和类别的查询。正如问题中提到的那样,category对象包含其他嵌套对象(即,它是一个沉重的静态对象) – 2012-07-29 04:01:58