2011-04-20 32 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();