2011-01-14 3 views
7

AppFabric 캐싱을 사용하여 EntLib을 사용하는 솔루션을 변환하려고합니다. 몇 가지 확장 방법을 사용하면 상당히 고통스럽지 않은 과정입니다.ASP.Net AppFabric 캐시 누락 된 플러시/지우기 및 계산/GetCount 메서드?

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); 
}

을하지만 변환하기 어려운 찾을 EntLib의 두 가지 기능이 있습니다

확장 방법은 내가 사용합니다. 즉 "Count"(캐시의 키 수 계산) 및 "Flush"(캐시에서 모든 데이터 제거)입니다. 캐시의 키를 반복 할 수 있다면 둘 다 해결할 수 있습니다.

ClearRegion(string region)이라는 메서드가 있지만 수동으로 오류가 발생하기 쉬운 작업이 필요한 모든 Get/Put/Add 메서드에서 영역 이름을 지정해야했습니다.

캐시에있는 키 목록을 가져 오는 방법이 있습니까?
기본 지역 이름을 사용할 수 있습니까?
지역 이름을 사용하지 않았을 때 어떻게 캐시를 비울 수 있습니까?

+0

위의 코드는 위의 .Contains() 메서드로 ".Count == 0"을 대체 할 수있게 해줍니다. –

답변

10

는 영역을 지정하지 않고 명명 된 지역에없는 객체의 수를 얻을 수있는 방법 때 캐시가 내부적으로 어떻게 작동하는지에 대한 나의 추측에 대한 my previous answer를 참조하십시오.

우리는 같은 기술을 사용하여 세척 방법을 구축 할 수 있습니다 : 내가 거기에 말했듯이

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

을, 나는라는 이름의 지역이 아마 갈 길을 생각 -을 사용하여 더 많은 문제를 해결 나에게 보인다 그것이 창조하는 것보다.

+0

감사합니다. 자동으로 전체 영역 집합이 생성 된 것으로 보입니다. Default_Region_0000에서 Default_Region_1023까지입니다. 모두 지우면 빈 상태 (Get-CacheStatistics)입니다. –

+10

영역을 사용하는 경우 하나의 캐시 호스트에만 영역이 생성되므로 캐시의 분산 부분이 손실됩니다. 제 생각에는 일반적으로 태그를 사용하는 특별한 이유가없는 한 지역에서 벗어나고 싶습니다. –

0

누군가 나 (나 같은) 미래에 문제가있을 경우 여기에 캐시 지우기에 대한 전체 코드가 있습니다.

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); 
     } 
관련 문제