2012-07-28 66 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