流行内容的Asp.net缓存实现
本文关键字:net 缓存 实现 Asp 流行 | 更新日期: 2023-09-27 18:05:02
在下面的代码中,我想要实现这一点:每次用户请求特定的内容时,我首先检查我是否已经在上的同一天上从DB获得了该内容。如果是这样,我将返回缓存的内容。如果没有,我首先从DB中重新检索内容,将其返回给用户并缓存它以供当天的下一个请求使用,依此类推。我想知道的是,如果它是一个很好的代码实践,节省(很多)DB时间上流行的内容。(我不太关心代码示例看起来如何,因为只是弥补了这个问题,它不会在我的应用程序中按原样使用…)
的代码示例:
public class ContentCachingExample
{
private static DateTime _lastRequestTime;
private static MyContent _cachedContent;
private static MyContent GetContent()
{
// compare dates - content will be re-retrieved from DB once a day.
if (DateTime.Now.Date> _lastRequestTime.Date)
{
_lastRequestTime = DateTime.Now;
_cachedContent = GetContentFromDb();
}
return _cachedContent;
}
private static MyContent GetContentFromDb()
{
// get content from DB
}
public class MyContent
{
public string Property1 { get; set; }
public int Property2 { get; set; }
}
}
是的,DB缓存是最佳实践的一部分,可以获得非常大的性能提升。如果你过于依赖它,你最终会得到非常糟糕的性能,比如在IIS工作器刚刚重启之后,与它运行了一个小时之后相比。
记得考虑缓存过期,如果这个流行的内容改变了怎么办?你需要多长时间才能看到新内容?你得到了很多性能提升的缓存时间比24小时小得多,如果你有一个页面浏览量每秒1分钟的缓存时间将节省你59次访问数据库,这意味着如果一个页面被斜线点,你有一个(小)生存的机会。
如果你正在使用MS-SQL,有一些方法可以在一行或表发生变化时使缓存无效
如果您正在使用ASP,您可能还需要研究输出缓存。这允许您根据URL参数缓存来自页面或控件的结果。这可以让你节省web服务器的CPU以及DB负载与你的缓存。
尝试使用System.Web.Cache
private MyContent GetContent(){
MyContent content = Cache[GetContentCacheKey()];
if(content == null) {
content = GetContentFromDb();
Cache.Add(GetContentCaceKey(), content, null, DateTime.Now.AddHours(1),
Cache.NoSlidingExpiration, CacheItemPriority.High, null);
}
return content;
}
你所做的是一个常见的模式。
您应该考虑一些现有的库,特别是当您需要对缓存机制进行微调时。
David提到了System.Web.Cache
还有企业库缓存块
但是,如果您只需要代码的当前功能,那么您所拥有的就可以了。
这就是所谓的过早优化。你正在尝试解决一个你(大概)不知道存在的问题。
这通常是有害的。例如,如果您现在遇到了糟糕的性能,这可能是因为您受到内存的限制:例如,在同一台机器上运行SQL Server和IIS,这太多了。在这种情况下,缓存db -content策略不会有帮助,它会使事情变得更糟。
如果有问题的DB查询需要很长时间来检索(如由您直接测量,并且确认对于用户来说等待时间太长:您真的必须执行这两个步骤),那么您可能会考虑您建议的一些东西。您将需要查看ASP。NETCache
对象,而不是自己重新创建它。快速搜索一下这个页面http://msdn.microsoft.com/en-us/library/aa478965.aspx,这可能是一个很好的起点。
除非您有性能问题,否则不要试图现在解决它。你可以这样开发——这就是为什么你应该开发具有清晰关注点分离、模块化、分层结构、服务架构等的应用程序:你可以很容易地添加一个"缓存层",如果需要