2017-03-01 140 views
1

我有一个包含大量数据的网站。 我使用C#.NET MVC4进行开发。 缓存为空时,我的页面加载速度很慢。 目前我正在使用一个缓存,其中包含我需要的所有数据,并且当页面上的缓存加载时,但当缓存过期时,大约需要10秒才能完全加载页面。自动刷新缓存ASP.NET

我正在寻找一个选项来自动刷新缓存到期时, 我一直在寻找在GOOLGE,但在这个问题上找不到任何

这怎么办呢? 还有其他的选择来解决这个问题吗?

感谢

+0

你使用什么样的缓存? – tomasmcguinness

回答

2

你可以缓存它与TTL第一个呼叫,让它失效,然后在下次调用会得到它,并重新缓存它回来。这样做的问题在于,当线程不可用时,它正在减慢线程的速度,并且多线程将等待它(假设您锁定了读取以防止泛洪)。

解决首次加载问题的一种方法是在应用程序启动时初始化缓存。这可以确保当您的应用程序准备好使用时,数据已经加载并且速度很快。创建一个像ICachePrimer这样的快速接口{void Prime()},扫描你的程序集,解决它们,然后运行它们。

我喜欢在失效问题上解决空缓存的方式是在数据被删除之前刷新数据。要在.Net中轻松完成此操作,可以使用MemoryCache的CacheItemPolicy回调函数。

UpdateCallback发生在项目被删除之前,并允许您刷新该项目。
删除项目后发生RemovedCallback。

在下面的例子中,当CachedRepository无效时,它会刷新缓存的项目。其他线程将继续收到“旧”值,直到刷新完成。

public class MyCachedRepository : IMyRepository 
{ 
    private readonly IMyRepository _baseRepository; 
    private readonly ObjectCache _cache; 

    public MyCachedRepository(IMyRepository baseRepository, ObjectCache cache) 
    { 
     _baseRepository = baseRepository; 
     _cache = cache; 
    } 

    public string GetById(string id) 
    { 
     var value = _cache.Get(id) as string; 

     if (value == null) 
     { 
      value = _baseRepository.GetById(id); 
      if (value != null) 
       _cache.Set(id, value, GetPolicy()); 
     } 

     return value; 
    } 

    private CacheItemPolicy GetPolicy() 
    { 
     return new CacheItemPolicy 
     { 
      UpdateCallback = CacheItemRemoved, 
      SlidingExpiration = TimeSpan.FromMinutes(0.1), //set your refresh interval 
     }; 
    } 

    private void CacheItemRemoved(CacheEntryUpdateArguments args) 
    { 
     if (args.RemovedReason == CacheEntryRemovedReason.Expired || args.RemovedReason == CacheEntryRemovedReason.Removed) 
     { 
      var id = args.Key; 
      var updatedEntity = _baseRepository.GetById(id); 
      args.UpdatedCacheItem = new CacheItem(id, updatedEntity); 
      args.UpdatedCacheItemPolicy = GetPolicy(); 
     } 
    } 
} 

来源:http://pdalinis.blogspot.in/2013/06/auto-refresh-caching-for-net-using.html

0

没有任何机制来自动刷新缓存时的按键失效。所有缓存系统都采用被动过期。在到期后第一次请求密钥时,密钥无效,而不是在该确切的到期时间自动进行。

你在说什么本质上是一个永不过期的缓存,它很容易实现。只要传递没有到期(如果缓存机制允许)或远期到期。然后,你的唯一的问题是刷新缓存在某个时间表,以便它不会过时。为此,一种选择是创建一个控制台应用程序,用于设置缓存中的值(重要的是,不必关心是否已经存在某些内容),然后使用Task Scheduler或类似的工具计划它以设定的时间间隔运行。另一种选择是使用诸如Revalee之类的东西在指定的时间间隔内将回调安排到您的Web应用程序中。这与创建控制台应用程序基本相同,只有代码可以集成到同一个网站项目中。

您还可以使用Hangfire直接在您的Web应用程序中执行调度,并可以使用它来运行控制台应用程序,打一个URL,无论如何。Hangfire的强大之处在于它可以让你安排任何你想要的进程,但是这也意味着你必须提供代码来实现应该发生的事情,比如实际连接到HttpClient并获取URL,而不是仅仅告诉Revallee命中一个特定的URL。