Asp.net-mvc'de önbelleğe alma


82

En fazla veritabanı ağır eylemlerimi asp.net-mvc sitemde önbelleğe almak istiyorum. Araştırmamda buldum

Ama henüz anladığımı sanmıyorum.
Birkaç parametreye bağlı olarak POST isteğimi önbelleğe alabilmek istiyorum. Bu parçalar bir nesnenin içindedir. Bu nedenle, aşağıdaki isteğin sonucunu önbelleğe almak istiyorum:

public ActionResult AdvancedSearch(SearchBag searchBag)

SearchBag, (bir grup) isteğe bağlı arama parametresini tutan bir nesnedir. Görüşlerimin kendisi hafiftir (olması gerektiği gibi), ancak veri erişimi, arama çantasında hangi alanların doldurulduğuna bağlı olarak oldukça zaman alıcı olabilir.

Eylemlerim yerine veri katmanımı önbelleğe almam gerektiğini hissediyorum.
VaryByParam'ı OutputCache özniteliğinde nasıl kullanacağım?


2
VaryByParam = "searchBag.property" ile denediniz mi?
Eduardo Campañó

hayır, yapmadım. Ne dediğini deneyeceğim. Ama birkaç parametreyi saymaya ne dersiniz?
Boris Callens

2
VaryByParam = "firstParam; secondParam; thirdParam"
Arnis Lapsa

1
Biraz geç, ancak Kurumsal Kitaplık Önbelleğe Alma Uygulama Bloğu .Net 4.0'a dahil edildi, bu nedenle artık benzer bir etki için System.Runtime.Caching'in MemoryCache özelliğini kullanabilirsiniz . Her yerde de :)
Carl

Yanıtlar:


74

Model veya veri katmanında da önbelleğe almayı seviyorum. Bu, denetleyiciden / sunumdan veri almakla ilgili her şeyi izole eder. ASP.NET önbelleğine System.Web.HttpContext.Current.CacheEnterprise Library'den erişebilir veya Önbelleğe Alma Uygulama Bloğunu kullanabilirsiniz. Önbelleğe alınan veriler için anahtarınızı sorgu parametrelerinden oluşturun. Verileri güncellerken önbelleği geçersiz kıldığınızdan emin olun.


1
Sanırım Enterprise Library'yi okumalıyım. Gecikmenin çoğu Veri Katmanında olduğu için, sonunda en iyi çözüm bu olacaktır. Şu anda salt okunur bir DB'dir, bu nedenle eski nesne sorununu ortadan kaldırır :)
Boris Callens

17
Önbelleğe alma uygulaması bloğu, tam bir aşırılık karmaşası gibi görünüyor. Hemen hemen her durumda HttpRuntime.Cache'nin fazlasıyla yeterli olduğunu buldum.
Jeff Putz

3
Neden aşırı öldürmek? Şimdi geliştirmede çok daha ileri gidiyorum ve EL'nin önbellek sistemini kullanmanın gerçekten kolay olduğunu buldum. Doğru kitaplığı referans alın, doğru yapılandırma satırlarını ekleyin ve her biri bir kod satırı ile nesneleri önbelleğe almaya ve almaya başlayabilirsiniz.
Boris Callens

6
Sanırım bazı insanları rahatsız eden "doğru yapılandırma satırlarını ekle" adımı.
Mike Chamberlain

Veritabanında güncelleme varken bellek önbelleğini nasıl geçersiz kılacağınızı, sık sık kontrol etmek için bir hizmet kullanıyor musunuz, ardından önbelleği nasıl temizlediğinizi de açıklarsanız iyi olur.
Shaiju T

66

Veya HttpContext.Current'dan bağımsız olabilir ve Cache'e HttpRuntime.Cache'den erişebilirsiniz :)


Bu ayrıca, kod bir arka plan iş parçacığı üzerinde çalıştırılırken (yani, zaman uyumsuz / iyiliği beklemek) 'önbelleğe' hala erişebileceğiniz anlamına gelir.
Michael K. Campbell

12

Çoğunlukla OutputCaching en hızlı ve verimli olabilir, ancak yalnızca gereksinimlerinizi karşıladığında. Yanlışsa hızlı verimli olmanın anlamı yok! ;)

Bu durumda, karmaşık önbelleğe alma ihtiyaçlarınız olduğu için veri katmanında önbelleğe almak doğru gibi görünüyor. Bazen, hangi çıktının önbelleğe alınacağını kontrol eden parametreler kümesi basitse ikisini birleştirebilirsiniz.


0

çıktı önbelleğe almayı bunun gibi bir şey kullanabilirsiniz

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

veya web yapılandırmasında ayarlanan önbellek profillerini kullanabilirsiniz

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.