c# - 在 ASP.NET 中使用缓存

标签 c# asp.net asp.net-mvc

我正在尝试使用 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/

相关文章:

c# - StackExchange.Redis key 按 UTC 日期过期

c# - 在 MVC Web Api 4 Beta 中从 Json 中删除空属性

c# - 从 C# SONAR 分析中排除生成的代码

asp.net - 混淆 url

c# - MVC ModelState 验证因空值而失败

c# - 在C#中获取文件的文件大小

mysql - 带有 MySQL 的 ASP.NET MVC 4 EF5

asp.net-mvc - mvc 返回 Json() 与基于 JSON 的 Web 服务

c# - 调整 GridView 编辑文本框大小

C# await X 和 .Result 在 ToDictionary() 中不等价?