我正在尝试使用 ASP.NET MVC Web 应用程序中的缓存来存储一些很少更新的列表数据。我用 UpdateCache()
方法将这些数据插入到缓存中,如下所示:
HttpContext.Current.Cache.Insert("MyApp-Products", products, null, DateTime.Now.AddYears(99), Cache.NoSlidingExpiration);
然后在我的模型中检索它:
public static List<string> GetProducts()
{
var cachedProducts = HttpContext.Current.Cache["MyApp-Products"];
if (cachedProducts == null)
{
UpdateCache();
cachedProducts = HttpContext.Current.Cache["MyApp-Products"];
}
return ((List<string>)cachedProducts );
}
我第一次访问页面时,UpdateCache()
按预期被调用。如果我刷新,数据来自缓存,我不需要调用 UpdateCache()
。然而,大约 15 分钟后,我回到应用程序,缓存值消失了。我的理解是这个缓存是每个应用程序的,而不是 session 的,所以我希望它仍然存在于我自己或其他用户那里。
我存储缓存的方式有问题吗?还是我不了解 ASP.NET 中的 Cache
在 Web 应用程序中的工作原理?
最佳答案
My understanding was that this cache was per application, not session, so I would have expected it to still be there for myself or another user.
虽然缓存是针对每个应用程序的,但 ASP.NET 不向您提供任何保证,如果您将某些内容存储到缓存中,您会在缓存中找到它。缓存可能会在不同情况下被逐出,例如您的服务器开始内存不足等。您可以订阅一个事件,并在某项从缓存中逐出时收到通知。您还可以在缓存项目时定义优先级。优先级越高,该项目被逐出的可能性越低。
此外,由于缓存存储在 Web 服务器的内存中(默认情况下),您不应忘记这样一个事实,即 IIS 可以随时回收您的应用程序域。例如,在一定数量的不活动之后,或者如果它开始内存不足,或者即使达到了某个 CPU 阈值使用率,...并且存储在内存中的所有内容(包括缓存)都将简单地消失在空隙中,下一个请求在您的应用程序中将启动一个新的 AppDomain。
但在任何情况下,请确保在使用之前检查该项目是否存在于缓存中。永远不要依赖这样一个事实,即如果将某些东西存储到其中,就会找到它。
所有这些废话都是为了真正重要的一点,这对您的代码来说是非常令人担忧的。看起来你正在存储 List<string>
实例放入缓存。但是由于缓存是针对每个应用程序的,因此 List<string>
的单个实例可以在应用程序的多个用户之间共享,当然这可以同时发生。如你所知List<T>
不是线程安全结构。因此,使用这段代码,最好的情况下,你会得到一个异常,最坏的情况是你会得到损坏的数据。因此,要非常小心缓存什么以及如何同步对结构的访问,尤其是在缓存非线程安全类时。
关于c# - 在 ASP.NET 中使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9641943/