2017-03-01 193 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。