2011-04-20 52 views
1

我有一個網站需要在其主頁上顯示「隨機」選項。這個列表生成起來有點貴,所以我想研究一下緩存,這個緩存仍然允許列表對於未經訓練的眼睛仍然顯得有些隨意。高速緩存「隨機」數據的一般策略

我的想法是在一個給定的範圍內使用一個隨機選擇的數字(假設爲10,作爲參數)作爲緩存鍵的一部分。僞代碼看起來像這樣:

randomCacheVariation = (random number between 1 and 10) 

cacheKey = "myRandomList_" + randomCacheVariation 

If cache.contains(cacheKey) Then 
    return existing random list 
Else 
    generate new radom list 
    add to cache 
    return list 
End If 

有沒有人有更好的建議,應該如何實現這樣的東西?

更新:

只是要清楚,我不是在尋找的緩存服務的實現,但如何通過存儲我的名單變化的一些有限數量的緩存僞隨機數據的策略緩存。

回答

1

你能在應用程序啓動時生成一個「隨機」名單可能100件?然後,如果你需要顯示10「隨機」的項目,隨機從100

支持文檔中進行選擇: https://stackoverflow.com/questions/462219/xkcd-random-number

+0

這是一個很好的建議......選擇一個大的初始抽樣,並將它緩存,然後選擇較小在每次請求時都會大聲喧譁。 – DanP 2011-04-20 16:25:05

+1

@DanP:如果沿着這條路線走下去,那麼當您生成隨機數據時,它不會減慢每個單獨的頁面請求。 *但是*,我會確保AppDomain在閒置時不會被卸載,否則下一個請求可能需要很長時間:http://stackoverflow.com/questions/838318/how-to-keep-asp-net -assemblies功能於AppDomain的活 – 2011-04-20 19:43:19

0

這是在C#中,但...

public static class Cache 
{ 
    public void Add<T>(string key, T item) 
    { 
     HttpRuntime.Cache[key] = item; 
    } 

    public T Get<T>(string key, Func<T> valueFactory) 
    { 
     var obj = HttpRuntime.Cache[key]; 

     if (obj == null) 
     { 
      if (valueFactory != null) 
      { 
       T tObj = valueFactory(); 

       Add(key, tObj); 

       return tObj; 
      } 

      return default(T); 
     } 

     return (T)obj; 
    } 
} 

然後你就可以使用它像這樣...

var randomSet = Cache.Get<string>("RandomResultSet",() => { 
    // pull down large random result-set 
    var randomSet = do stuff; 
    return randomSet; 
}); 

// Now that we have a large result set cached, let's select a smaller one 
var randomStuff = randomSet.GetSmallerRandomSet();