在下面的代码中,我希望实现此目的:每次用户请求特定内容时,我首先检查我是否已在当天从数据库中获取此内容。 如果是这样 - 我将返回缓存的内容。如果不是 - 我首先从数据库中重新检索内容,将其返回给用户并将其缓存以供今天的下一个请求使用,依此类推。 我想知道的是,如果在流行内容上节省(大量)数据库时间是一个很好的代码实践。 (我不太关心代码示例的外观,只是为了解决这个问题并且不会在我的应用程序中使用它。)
代码示例:
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; }
}
}
答案 0 :(得分:2)
是的,数据库缓存是最佳实践的一部分,可以带来非常大的性能提升。如果你过分依赖它,你可能会在IIS工作人员刚刚重新启动后比较一次运行一小时之后就会表现出非常低的性能。
请记住考虑缓存过期,如果这个受欢迎的内容发生变化会怎么样?您使用多长时间才能看到新内容?如果你有一个页面视图,第二个缓存时间为1分钟将为你节省59次访问数据库并且意味着如果页面被斜线控制,你会得到很多性能提升缓存时间。 (小)幸存的机会。
如果您正在使用MS-SQL,如果行或表发生更改,有invalidate caches的方法
如果您使用的是ASP.NET,您可能还想要investergate output caching,这允许您根据URL参数缓存页面或控件的结果。这允许您通过缓存来保存Web服务器CPU和数据库负载。
尝试使用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;
}
答案 1 :(得分:0)
这称为过早优化。你试图解决你(可能)不知道存在的问题。
这通常是有害的。例如,如果您现在遇到性能不佳,可能是因为您受到内存的限制:例如,在同一台计算机上运行SQL Server和IIS,而且太多了。在这种情况下,缓存-DB-内容策略无济于事,这会使事情变得更糟。
如果有问题的数据库查询需要很长时间才能检索(由直接测量,确认,用户等待的时间太长了:你真的必须做这两个步骤),然后你可能会考虑你的建议。您将需要查看ASP.NET Cache
对象,而不是自己重新创建它。快速谷歌出现在这个页面http://msdn.microsoft.com/en-us/library/aa478965.aspx,这可能是一个很好的起点。
除非遇到性能问题,否则请勿尝试解决。您可以开发这样的事情 - 这就是为什么您应该开发明确分离关注点,模块化,分层结构,服务架构等的应用程序:您可以在以后轻松添加“缓存层”,如果需要
答案 2 :(得分:0)
你在做什么是一种常见的模式。
您应该考虑一些存在的库,特别是如果您需要微调缓存机制。
David提到了System.Web.Cache
还有Enterprise Library Caching Blocks
但是,如果您只需要代码的当前功能,那么您所拥有的就可以了。