流行内容的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; }
    }
 }

流行内容的Asp.net缓存实现

是的,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。NET Cache对象,而不是自己重新创建它。快速搜索一下这个页面http://msdn.microsoft.com/en-us/library/aa478965.aspx,这可能是一个很好的起点。

除非您有性能问题,否则不要试图现在解决它。你可以这样开发——这就是为什么你应该开发具有清晰关注点分离、模块化、分层结构、服务架构等的应用程序:你可以很容易地添加一个"缓存层",如果需要