2011-01-14 4 views
7

Tôi đang cố gắng chuyển đổi một giải pháp sử dụng EntLib thành sử dụng bộ nhớ đệm AppFabric. Với sự giúp đỡ của một vài phương pháp khuyến nông, đây là một quá trình khá đau đớn.ASP.Net AppFabric Cache thiếu phương thức Flush/Clear và Count/GetCount?

phương pháp mở rộng tôi sử dụng:

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

Nhưng có hai tính năng của EntLib tôi thấy khó khăn để chuyển đổi. Cụ thể là "Đếm" (đếm số lượng khóa trong bộ nhớ cache) và "Xảy ra" (xóa tất cả dữ liệu khỏi bộ nhớ cache). Cả hai có thể được giải quyết nếu tôi có thể lặp lại các phím trong bộ nhớ cache.

Có một phương pháp gọi là ClearRegion(string region), nhưng điều đó yêu cầu tôi chỉ định tên khu vực trên tất cả các phương thức Get/Put/Add-tôi sử dụng, điều này sẽ yêu cầu một số công việc dễ bị lỗi.

Có cách nào để lấy danh sách các khóa trong bộ nhớ cache không?
Có tên vùng mặc định tôi có thể sử dụng không?
Làm cách nào để xóa bộ nhớ cache khi tôi chưa sử dụng tên vùng?

+0

Mã cho phép tôi thay thế ".Count == 0" bằng phương thức .Contains() ở trên. –

Trả lời

10

Xem my previous answer cho số đầu cơ về cách bộ nhớ cache hoạt động nội bộ khi bạn không chỉ định khu vực và cách bạn có thể đếm số đối tượng không nằm trong vùng được đặt tên.

Chúng tôi có thể xây dựng một phương pháp xả bằng cách sử dụng kỹ thuật tương tự:

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

Như tôi đã nói ở đó, tôi nghĩ rằng khu vực được đặt tên là lẽ con đường để đi - có vẻ như với tôi rằng việc sử dụng chúng giải quyết được nhiều vấn đề hơn hơn nó tạo ra.

+0

Cảm ơn. Dường như nó đã tạo ra một tập hợp toàn bộ các vùng tự động. Mặc định_Region_0000 thông qua Default_Region_1023. Xóa tất cả các chương trình cho thấy chúng trống (Get-CacheStatistics). –

+10

Nếu bạn sử dụng các vùng, bạn sẽ mất phần phân phối của bộ nhớ cache vì các vùng chỉ được tạo trên một máy chủ lưu trữ bộ nhớ cache. Tôi nghĩ, nói chung, bạn sẽ muốn tránh xa các khu vực trừ khi bạn có một lý do rất cụ thể để sử dụng chúng (nghĩa là thẻ). –

0

Nếu có ai gặp sự cố trong tương lai (như tôi) - đây là mã đầy đủ để xóa bộ nhớ cache.

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