【问题标题】:OutputCache of .NET MVC5 App in Azure Falls Out of Cache QuicklyAzure 中 .NET MVC5 应用的 OutputCache 快速耗尽缓存
【发布时间】:2018-02-28 17:34:48
【问题描述】:

我的目标基本上一直缓存所有页面,这样用户就很少需要点击我的 CMS 来获取内容。

我在 Azure 中部署了一个 c#/.Net MVC 5 Web 应用程序。我还将控制器上的所有OutputCache 设置为 1 周 [604800s](内容很少更改)。我可能天真地假设缓存的输出存储在 Azure 的内存中。但是,当我启动我的应用程序并爬取网站时,我希望 Azure 内存会填满缓存的内容,但实际上,可能内存利用率会有所提高。不过,它会在大约 5 分钟后恢复到大约 60% 利用率的“静止状态”。我也尝试过使用MemoryCache,但它有类似的结果 - 内存使用量增加,不久之后又恢复正常。

在任何情况下,结果都是页面表现得好像它们没有被缓存一样。例如,如果我抓取 1 个页面并访问它 - 它会在大约 1 秒内加载(它已被缓存)。如果我抓取 2000 个页面并访问一个随机页面,它会在 3-4 秒内加载(它没有被缓存)。我已经通过在视图本身中放置一个日期时间来对此进行测试。

所以...底线是:缓存 = 快速,未缓存 = 平均。我希望它快!

我查看了 Redis Cache,这可能是一种实现方式,而且看起来很简单......但我的直觉认为这应该是基本功能(因为它内置在框架中)。

【问题讨论】:

    标签: c# asp.net asp.net-mvc azure caching


    【解决方案1】:

    Azure Web App 确实支持内存中的 OutputCache。我们可以使用以下代码轻松确认。刷新TestCache页面后,输出日期时间不会改变。

    [OutputCache(Duration = 3600)]
    public ActionResult TestCache()
    {
        return Content(DateTime.Now.ToString());
    }
    

    但是在 Azure Web App 中使用内存缓存时会出现一些问题。

    这样做的第一个问题是它限制了您的网络应用实例上可用的内存,当您缓存大量页面输出数据时,这可能会产生内存不足的问题。如果您的内存已满,您的 Web 应用程序将重新启动。 如果网络应用重新启动,所有缓存的内容都将丢失。另一个问题是您的应用运行在多个负载均衡的实例上。下一个请求可能会转到另一个实例,该实例也会在此实例中创建 ASP.NET 输出缓存数据的新副本。每个 Web 角色实例中的这些页面输出的冗余副本会消耗大量额外的内存。

    为了避免上面的问题,我建议你使用Redis Cache来存储缓存的内容。 Redis Cache的使用方法,参考以下链接。

    ASP.NET Output Cache Provider for Azure Redis Cache

    【讨论】:

    • 谢谢!我们昨天弄清楚了多实例的事情。这是获得可重复结果的一个大问题。在减少实例数量后,我还看到一些 Web 应用程序在达到 90% 内存后被重置——我在负载测试中遇到了困难。
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2021-10-06
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多