.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。
答案 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?
您还可以使用fiddler或charles proxy等工具来帮助您确定客户端的时间。
您可能还需要考虑一个日志记录工具,您应该能够轻松地从日志记录信息中判断您的缓存是否被命中,或者您是从数据库加载数据,猜测不是您通常对此类事情所做的事情。我使用Log4net ......
http://www.codeproject.com/Articles/14819/How-to-use-log-net
http://logging.apache.org/log4net/
它有许多不同的记录方法,例如电子邮件,日志文件,数据库表等等。