2011-01-14 12 views
7

AppFabric önbellekleme kullanarak EntLib kullanarak bir çözümü dönüştürmeye çalışıyorum. Birkaç uzatma metodu yardımıyla bu oldukça acı verici bir süreçtir.ASP.Net AppFabric Önbellek Flush/Clear ve Count/GetCount yöntemlerini eksik?

public static bool Contains(this DataCache dataCache, string key) 
{ 
    return dataCache.Get(key) != null; 
} 

public static object GetData(this DataCache dataCache, string key) 
{ 
    return dataCache.Get(key); 
}

Ama dönüştürmek için zor EntLib iki özellik vardır:

Uzatma yöntemleri kullandığım. Yani "Say" (önbellekteki anahtarların sayma sayısı) ve "Flush" (önbellekten tüm veriler kaldırılır). Anahtarları önbellekte yineleyebilirsem her ikisi de çözülebilirdi.

ClearRegion(string region) adlı bir yöntem var, ancak kullanmam gereken tüm El İle/Kola/Ekleme yöntemlerinde bir bölge adı belirtmemi gerekli kılıyor, bu da bazı manuel hataya eğilimli çalışma gerektiriyor.

Önbellekte bir anahtar listesi almanın bir yolu var mı?
Kullanabileceğim varsayılan bölge adı var mı?
Bölge adı kullanmadığımda önbelleği nasıl temizleyebilirim?

+0

Kod, ".Count == 0" değerini yukarıdaki .Contains() yöntemiyle değiştirmeme izin verdi. –

cevap

10

bir bölgeyi belirtmeyen ve bir adlandırılmış bölgede olmayan nesnelerin sayısı elde edebilir nasıl zaman önbellek dahili olarak nasıl çalıştığına dair benim spekülasyon için my previous answer bakınız.

Biz aynı tekniği kullanarak bir Flush yöntemi inşa edebilirsiniz: Orada söylediğim gibi

public void Flush (this DataCache cache) 
{ 
    foreach (string regionName in cache.GetSystemRegions()) 
    {  
     cache.ClearRegion(regionName) 
    } 
} 

, ben adlandırılmış bölgeler muhtemelen gitmek için yol olduğunu düşünüyorum - onları kullanarak daha fazla sorunları çözer geliyor bana yarattığıdan.

+0

Teşekkürler. Otomatik olarak bir dizi bölge oluşturmuş gibi görünüyor. Default_Region_0000 ile Default_Region_003. Tümünün temizlenmesi boş olduklarını gösterir (Get-CacheStatistics). –

+10

Bölgeleri kullanırsanız, bölgeler yalnızca bir önbellek ana bilgisayarında oluşturulduğundan, önbelleğin dağıtılmış bölümünü kaybedersiniz. Genel olarak, bunları kullanmak için çok özel bir nedeniniz olmadığı sürece bölgelerden uzak kalmak isteyeceğinizi düşünüyorum (yani, etiketler). –

0

Gelecekte (benim gibi) sorun yaşarsa - burada önbelleği temizlemenin tam kodu.

private static DataCacheFactory _factory; 
     private const String serverName = "<machineName>"; 
     private const String cacheName = "<cacheName>"; 

     static void Main(string[] args) 
     { 
      Dictionary<String, Int32> cacheHostsAndPorts = new Dictionary<String, Int32> { { serverName, 22233 } }; 
      Initialize(cacheHostsAndPorts); 
      DataCache cache = _factory.GetCache(cacheName); 
      FlushCache(cache); 
      Console.WriteLine("Done"); 
      Console.ReadLine(); 
     } 

     private static void FlushCache(DataCache cache) 
     { 
      foreach (string regionName in cache.GetSystemRegions()) 
      { 
       cache.ClearRegion(regionName); 
      } 
     } 

     public static void Initialize(Dictionary<String, Int32> cacheHostsAndPorts) 
     { 
      var factoryConfig = new DataCacheFactoryConfiguration 
      { 
       Servers = cacheHostsAndPorts.Select(cacheEndpoint => new DataCacheServerEndpoint(cacheEndpoint.Key, cacheEndpoint.Value)) 
      }; 

      _factory = new DataCacheFactory(factoryConfig); 
     } 
İlgili konular