2009-09-14 63 views
3

尽管我已经指定了一个唯一的键,但似乎下面的代码将为5个请求返回一个值,然后再为另一个返回另一个值,然后恢复到原始请求中保存的值并继续,直到有10个不同的值对象全部存储在相同的密钥下。 它似乎几乎随机哪些值将从缓存中返回。Httpruntime缓存键不是唯一的吗?

string strDateTime = string.Empty; 
string cachename = "datetimeexample"; 
object cachedobject = HttpRuntime.Cache.Get(cachename); 
if (cachedobject != null) 
    strDateTime = (string)cachedobject; 
else 
{ 
    strDateTime = DateTime.Now.ToString(); 
    HttpRuntime.Cache.Insert(cachename, strDateTime, null, DateTime.MaxValue, TimeSpan.FromDays(10), CacheItemPriority.NotRemovable, null); 
} 
Response.Write(strDateTime +"  keys:"+ HttpRuntime.Cache.Count); 

非常困惑,这是因为线程还是什么?

+0

你确定它存储多个对象具有相同的密钥?也就是说,你确定钥匙*完全相同吗?如果键已经存在,'Insert'方法应该覆盖现有的对象。 – LukeH 2009-09-14 12:04:03

+0

是的,关键是完全一样的,代码片断包装在静态方法/类中的图像。 – maxp 2009-09-14 12:46:52

+0

您正在单台机器或服务器场上运行吗? – LukeH 2009-09-15 10:06:18

回答

2

忽略服务器场和负载平衡的可能性,此行为可能是由作为web-garden运行的应用程序池导致的。若要从MSDN引用的相关章节:

因为Web园能够使用 多个进程,每个进程将 有它自己的应用程序副本 状态,进程中的会话状态, 缓存和静态数据。网络花园 不应该用于所有 应用程序,特别是如果它们需要 来维护状态。在确定 网络花园模式是否合适之前,请务必以 为基准测试 应用程序的性能。

这将导致它看起来好像缓存为同一个键存储多个值,在高速缓存中有效地存在重复条目。

要在IIS 7中解决这个问题,打开应用程序池的高级设置并设置最大工作进程 1。对于IIS 6,请参阅MSDN article(漂亮的截图)。

尽管晚了8个月,我回答了这个问题,因为我发现它很久之前我发现了this decent article on web-garden gotchas。希望这个答案能够为未来的搜索者节省大量的时间。 :)

0

您的快捷键始终是'datetimeexample',因此,您将始终有一个对象在缓存中;你会一直收到那个对象。

我不太清楚你在这里试图完成什么,就我而言,它的行为完全和它应该做的一样。

+0

我想检索最初缓存在第一页请求中的对象,在随后的请求中。 – maxp 2009-09-14 11:53:50

+0

我无法重现您的问题,因为这看起来非常好。猜猜这应该是你的IIS设置中的东西。 – 2009-09-14 11:56:06

+0

因此,您的应用程序将只添加x1键并不断检索相同的键? – maxp 2009-09-14 11:57:15

相关问题