Thứ Sáu, 29 tháng 6, 2012

Giới thiệu về Object Caching trên .NET Framework 4


Bài viết này nhằm sử dụng một lớp tiện ích về Object Caching để cache dữ liệu do Dean Hume giới thiệu. Với lớp này, bạn sẽ dễ dàng cache dữ liệu hoặc các đối tượng nếu muốn và có thể lấy về một cách dễ dàng với sự trợ giúp của kỹ thuật Generics.

Khi bạn lập trình, bạn sẽ luôn muốn ứng dụng của mình chạy nhanh nhất, và một trong những cách hiệu quả đó là sử dụng kỹ thuật caching. Kỹ thuật này sẽ lưu lại các dữ liệu mà ứng dụng hay sử dụng và lưu trữ tạm. Do đó, khi có yêu cầu những dữ liệu đó với những tham số tương tự, thay vì lấy dữ liệu từ CSDL hay yêu cầu mã lệnh tính toán để trả về kết quả, thì ứng dụng sẽ lấy kết quả đã được lưu trữ sẵn từ Cache sẽ được triệu gọi và trả về cho người dùng. Cache là một công cụ tuyệt với giúp bạn có thể lưu tạm mọi thứ, từ chuỗi cho đến các đối tượng phức tạp. Hiện nay có một số kiểu caching khác nhau dành cho các lập trình viên .NET, nhưng trong phạm vi bài viết này, chúng tôi chỉ giới thiệu về kỹ thuật object caching và lớp hỗ trợ của Dean Hume, một blogger nổi tiếng với nhiều bài viết về C# và ASP.NET.
Trước đây đối tượng cache được đặt trong namespace System.Web.Caching. Bởi vì nó quá hiệu quả và tiện dụng, nhiều lập trình viên mong muốn sử dụng nó cho các dự án khác như WPF hoặc Windows Form chứ không phải chỉ là các dự án Web. Với .NET Framework 4, lớp quản lý cache đã được chuyển đến namespace mới có tên là System.Runtime.Caching, và dù lớp cũ ở namespace System.Web.Caching vẫn còn, nhưng mọi cập nhật và cải tiến sẽ chỉ được thêm vào cho System.Runtime.Caching.
Không gian tên System.Runtime.Caching hỗ trợ lưu cache ở bộ nhớ, ở thiết bị lưu trữ hoặc ở các đối tượng của ứng dụng (ObjectCaching). Và trong bài viết này chúng ta chỉ đề cập đến ObjectCaching.
Để bắt đầu sử dụng caching, bạn hãy tham chiếu đến System.Runtime.Caching cho dự án của bạn.
Nếu bạn muốn thêm một đối tượng vào cahce, bạn có thể sử dụng phương thức AddItem được cài đặt như sau:

public void AddItem(object objectToCache, string key)
        {
            ObjectCache cache = MemoryCache.Default;
            cache.Add(key, objectToCache, DateTime.Now.AddDays(30));
        }
 

Ở trong phương thức này chúng ta sử dụng đối tượng MemoryChace mặc định, tuy nhiên bạn vẫn có thể sử dụng nhiều đối tượng MemoryCache khác nhau trong cùng một ứng dụng.
Sau đó chúng ta thêm đối lượng cần cache vào đối tượng cache với một mã khóa (key). Mã khóa key sẽ giúp chúng ta truy xuất lại đối tượng nsau này.
Để truy xuất lại đối tượng đã cache, chúng chỉ cần sử dụng mã lệnh dưới đây:

public object Get(string key)
        {
            var cache = MemoryCache.Default;
 
            try
            {
                return Cache[key];
            }
            catch
            {
                return null;
            }
        }
 

Như để có thể sử dụng cache một cách dễ dàng và hơn hết là dễ dàng triệu gọi các đối tượng đã được cache,  chúng ta nên học theo Dean Hume để tạo ra một lớp tiện ích giúp sử dụng đối tượng MemoryCache.Default một cách dễ dàng hơn và trả đối tượng được cache về theo đúng kiểu dữ liệu của chúng.  Lớp này có tên là CacheLayer, và sử dụng Generics để bạn có thể ép kiểu trực tiếp khi lưu đối tượng vào cache, lẫn khi lấy ra. Cài đặt của CacheLayer như sau:

public class CacheLayer
    {
        static readonly ObjectCache Cache = MemoryCache.Default;
 
        /// 
        /// Retrieve cached item
        /// 
        /// Type of cached item
        /// 
Name of cached item
        /// Cached item as type
        public static T Get(string key) where T : class
        {
            try
            {
                return (T)Cache[key];
            }
            catch
            {
                return null;
            }
        }
 
        /// 
        /// Insert value into the cache using
        /// appropriate name/value pairs
        /// 
        /// Type of cached item
        /// 
Item to be cached
        /// 
Name of item
        public static void Add(T objectToCache, string key) where T : class
        {
            Cache.Add(key, objectToCache, DateTime.Now.AddDays(30));
        }
 
        /// 
        /// Insert value into the cache using
        /// appropriate name/value pairs
        /// 
        /// 
Item to be cached
        /// 
Name of item
        public static void Add(object objectToCache, string key)
        {
            Cache.Add(key, objectToCache, DateTime.Now.AddDays(30));
        }
 
        /// 
        /// Remove item from cache
        /// 
        /// 
Name of cached item
        public static void Clear(string key)
        {
            Cache.Remove(key);
        }
 
        /// 
        /// Check for item in cache
        /// 
        /// 
Name of cached item
        /// 
        public static bool Exists(string key)
        {
            return Cache.Get(key) != null;
        }
 
        /// 
        /// Gets all cached items as a list by their key.
        /// 
        /// 
        public static List<string> GetAll()
        {
            return Cache.Select(keyValuePair => keyValuePair.Key).ToList();
        }
 
        
    }
 

Ví dụ như chúng ta lưu vào cache đối tượng List có tên là customerNames, chúng ta sẽ gọi như sau:

CacheLayer.Addstring>>(customerNames, cachKey); 
 Và khi cần lấy dữ liệu ra từ ache chúng ta có thể  gọi:

var names = CacheLayer.Getstring>>(cacheKey); 

Như vậy tôi đã giới thiệu cho bạn một lớp tiện ích để có thể sử dụng cache một cách dễ dàng với bất kỳ nào ứng dụng của bạn, tuy nhiên, cách xây dựng lớp CacheLayer này thực sự vẫn có nhiều điều để đáng bàn, đặc biệt khi bạn biết rằng có nhiều phương thức để Cache và bạn không chỉ sử dụng một cách caching duy nhất như vậy, và đặc biệt khi bạn đã có một chút quan tâm đến các nguyên lý lập trình hướng đối tượng và kể cả TDD (Test Driven Development) bạn sẽ cài đặt nó theo một cách khác. Tất nhiên Dean Hume đã bỏ qua một số nguyên tắc để có thể tạo một lớp trợ giúp một cách nhanh chóng và bạn vẫn có thể tùy biến theo cách của bạn.

Không có nhận xét nào: