2011-11-26 34 views
6

Chúng tôi đang sử dụng mẫu sau để xử lý bộ nhớ đệm của các đối tượng phổ dụng cho ứng dụng asp.net của chúng tôi.Tôi làm cách nào để triển khai bộ nhớ đệm không đồng bộ?

private object SystemConfigurationCacheLock = new object(); 
public SystemConfiguration SystemConfiguration 
{ 
    get 
    { 
     if (HttpContext.Current.Cache["SystemConfiguration"] == null) 
      lock (SystemConfigurationCacheLock) 
      { 
       if (HttpContext.Current.Cache["SystemConfiguration"] == null) 
        HttpContext.Current.Cache.Insert("SystemConfiguration", GetSystemConfiguration(), null, DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration, new CacheItemUpdateCallback(SystemConfigurationCacheItemUpdateCallback)); 
      } 
     return HttpContext.Current.Cache["SystemConfiguration"] as SystemConfiguration; 
    } 
} 

private void SystemConfigurationCacheItemUpdateCallback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration) 
{ 
    dependency = null; 
    absoluteExpiration = DateTime.Now.AddMinutes(1); 
    slidingExpiration = Cache.NoSlidingExpiration; 
    expensiveObject = GetSystemConfiguration(); 
} 

private SystemConfiguration GetSystemConfiguration() 
{ 
    //Load system configuration 
} 

Vấn đề là khi đang có tải (~ 100.000 người dùng) chúng ta thấy sự nhảy vọt về TTFB như các khối CacheItemUpdateCallback tất cả các chủ đề khác từ thực hiện cho đến khi nó đã hoàn thành làm mới bộ nhớ cache từ các cơ sở dữ liệu. Vì vậy, những gì tôi thấy chúng ta cần là giải pháp khi thread đầu tiên sau khi hết hạn bộ nhớ cache cố gắng truy cập nó, một chuỗi không đồng bộ được tắt để cập nhật bộ nhớ cache nhưng vẫn cho phép tất cả các chuỗi thực thi khác đọc từ cũ. Quay trở lại đầu trang cache cho đến khi nó được cập nhật thành công.

Có bất kỳ thứ gì được tích hợp trong khuôn khổ .NET có thể xử lý nguyên bản những gì tôi yêu cầu không hoặc tôi có phải viết nó từ đầu không? suy nghĩ của bạn xin vui lòng ...

Một vài điều ...

Việc sử dụng các HttpContext.Current.Cache là ngẫu nhiên và không nhất thiết cần thiết khi chúng ta đã không có vấn đề sử dụng các thành viên tư nhân trên một singleton để giữ dữ liệu được lưu trong bộ nhớ cache.

Vui lòng không nhận xét về thời gian bộ nhớ cache, hiệu quả SPROC, tại sao chúng tôi lưu vào bộ nhớ cache ở vị trí đầu tiên vv vì nó không liên quan. Cảm ơn!

Trả lời

0

Vì vậy, nó quay ra sau vài giờ điều tra rằng vấn đề không phải là CacheItemUpdateCallback chặn chủ đề khác như tôi nghĩ ban đầu, trên thực tế nó đã chính xác những gì tôi muốn nó không đồng bộ nhưng chính nhà sưu tầm rác đã dừng mọi thứ để làm sạch LOH.

+0

Và giải pháp là gì? – orjan

+0

Không sử dụng mẫu này để lưu trữ các đối tượng mà sau đó có thể kết thúc trên LOH. –

Các vấn đề liên quan