3

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

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);

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

4

2 回答 2

2

忽略服务器场和负载平衡的可能性,此行为可能是由作为web-garden运行的应用程序池引起的。引用 MSDN 的相关部分:

因为 Web 园可以使用多个进程,所以每个进程都有自己的应用程序状态副本、进程内会话状态、缓存和静态数据。网络花园不应该用于所有应用程序,尤其是当它们需要维护状态时。在决定 Web 园模式是否合适之前,请务必对应用程序的性能进行基准测试。

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

要在 IIS 7 中解决此问题,请打开应用程序池的高级设置并将最大工作进程设置为 1。对于 IIS 6,请参阅MSDN 文章(带有漂亮的屏幕截图)。

尽管晚了 8 个月,但我正在回答这个问题,因为我早在我在 web-garden gotchas 上找到这篇体面的文章之前就发现了它。希望这个答案能为未来的搜索者节省大量时间。:)

于 2010-06-04T12:46:17.817 回答
0

您的缓存键始终是“日期时间示例”,因此,您将始终在缓存中拥有一个对象;并且您将始终收到该对象。

我不太确定你在这里想要完成什么,就我而言,这完全符合它应该做的方式。

于 2009-09-14T11:52:39.753 回答