我將每個用戶顯示有關事件的所有活動的用戶訂閱和進料將在最新的20個左右的活動拉開活動供稿。我擁有它的方式是所有活動,而不管其相關的事件是否存儲在一個集合中,並且文檔本身具有查詢和索引的「事件」屬性。基本查詢只是從集合中選擇活動,其中事件位於按日期排序的用戶事件訂閱列表中。我存儲了用戶事件訂閱列表的哈希值,並使用哈希值作爲xx秒的鍵值來緩存查詢結果,因此如果另一個用戶訂閱了相同的確切事件,我可以將結果從緩存中取出,而不是不關心結果是xx秒陳舊。最佳方式來處理基於活動的飼料在asp.net和ravendb
編輯:添加模型和查詢例如
型號:
User
{
// useless properties excluded
// fixed: hashset not list, can be quite large
HashSet<string> Subscriptions { get; set; }
string SubscriptionHash { get; set; } // precomputed hash of all strings in subscriptions
}
Activity
{
// Useless properties excluded
string ActivityType { get; set; }
}
查詢:
if (cache[user.SubscriptionHash] != null)
results = (HashSet<Activity>)cache[user.SubscriptionHash];
else
results = session.Query<Activity>().Where(user.Subscriptions.Contains(e => e.ActivityType)).Take(20).ToList();
// add results to cache
我擔心的是,如果這是處理這個最好的辦法,或者有更好的ravendb巫毒使用。單集可能增長到數以百萬計,如果有很多的活動,我可能被存儲數千鍵在緩存中時,有數以千計的訂閱列表無窮的組合的用戶。這些供稿在用戶的着陸頁上,因此它被擊中了很多,我不想只是拋出更多的硬件來解決問題。
所以回答我真的想找或者是如果這是用最好的查詢,如果有更好的方法來做到這一點的烏鴉,當我可以查詢反對數百萬使用list.Contains文件。
這是一個使用ravendb的asp.net 4.5 mvc 4項目。
您可以編輯並提供您目前建模的示例嗎? –
可能是更好的表述爲。凡(E => e.ActivityType.In(user.Subscriptions.ToArray())) –