将.NET用于Web应用程序,如何在根(应用程序)级别缓存数据?

时间:2014-08-28 00:28:53

标签: .net asp.net-mvc-4 caching rackspace-cloud

设置

.NET 4.5,.NET MVC 4,IIS 8,c#

背景

我多年来一直使用HttpContext.Current.Cache来缓存单个用户会话的构造对象,以提高性能。这很有效。

现在我需要在根级别缓存构造对象,以便来自任何浏览器的任何用户请求具有应该缓存的信息的页面,将从缓存中获取该数据,而不是从中提取该数据的对象。 ;来自后端的数据。

因此,我将缓存从HttpContext.Current.Cache更改为HttpRuntime.Cache。以下是将对象添加到缓存的示例:

/// <summary>
    ///     Insert value into the cache using
    ///     appropriate name/value pairs
    /// </summary>
    /// <typeparam name="T">Type of cached item</typeparam>
    /// <param name="o">Item to be cached</param>
    /// <param name="key">Name of item</param>
    public static void Add<T>(T o, string key)
    {
        if (!string.IsNullOrEmpty(key))
        {
            // NOTE: Apply expiration parameters as you see fit.
            HttpRuntime.Cache.Insert(
                key,
                o,
                null,
                DateTime.Now.AddDays(30),
                Cache.NoSlidingExpiration);
        }
    }

问题

执行此操作后,我在Chrome桌面上加载了一个页面,并希望它在第一个请求需要调用数据库并构建我的对象时加载缓慢。

然后,我去了另一台电脑并拨打同一页面,这花了很长时间!在每个不同的PC /浏览器上发出第一个请求之后,它应该是快速闪亮的。这表明我的对象仍然在每个会话的基础上缓存。

可能性

如果没有人发现我犯过的明显错误,我想知道我的问题是否可能是由于服务器集群分发应用程序造成的。因此,如果有人对此有所了解,我正在使用Rackspace Cloud Hosting。

1 个答案:

答案 0 :(得分:0)

很确定你会发现HttpContext.Current.Cache不是用户特定的。那就是Session。如上所述...

Difference between HttpRuntime.Cache and HttpContext.Current.Cache?

...使用HttpContext.Current.Cache和HttpRuntime.Cache之间没有区别。

我建议发生的事情是每个客户端都缓存html /图像等。另一种可能是您的应用程序位于服务器场中,在这种情况下,如果您的第二个用户访问不同的计算机,则缓存不会填充,缓存是每台机器的本地。

我建议你需要使用某种性能工具来实际确定应用程序中发生了什么。以下是性能分析的讨论

How to analyze the performance of requests in ASP.NET MVC application?

您还可以使用fiddlercharles proxy等工具来帮助您确定客户端的时间。

您可能还需要考虑一个日志记录工具,您应该能够轻松地从日志记录信息中判断您的缓存是否被命中,或者您是从数据库加载数据,猜测不是您通常对此类事情所做的事情。我使用Log4net ......

http://www.codeproject.com/Articles/14819/How-to-use-log-net

http://logging.apache.org/log4net/

它有许多不同的记录方法,例如电子邮件,日志文件,数据库表等等。