Cách triển khai Memory Cache đơn giản cho Web API Lập trình ASP.NET


Trong ASP.NET MVC Controller các bạn cũng là làm quen với Output Caching mà mình giới thiệu trong các khóa học ASP.NET MVC. Đó là một trong những cách triển khai caching đơn giản nhất cho ứng dụng ASP.NET MVC sử dụng thư viện sẵn có của nó.

Caching chính là việc giảm thiểu việc lấy dữ liệu liên tục từ nguồn khác đối với các dữ liệu hay truy cập và ít thay đổi. Các bạn nhớ là phải đảm bảo 2 tiêu chí là mức độ truy cập thường xuyên và dữ liệu ít thay đổi. Ví dụ: Danh mục sản phẩm, quyền người dùng, sản phẩm xem nhiều…Điều này làm tăng tốc độ tải trang do dữ liệu được cache sẵn trên bộ nhớ và tiết kiệm thời gian.

Thường trng ASP.NET Web API bạn sẽ cần phải cache một số thứ tạp thời trên bộ nhớ để tăng hiệu năng của chương trình.

Có một vài thư viện hữu ích giúp bạn làm điều đó. Một trong số đó rất phổ biến là CacheCow bạn có thể xem hướng dẫn tại đây. Nhưng nếu bạn muốn sử dụng caching mà không muốn dùng một thư viện của bên thứ 3 nào cả vậy thì làm sao để triển khai nhanh nhất.

Caching cho Web API không sử dụng third party

Tôi đã triển khai một vài lần việc chứng thực người dùng sử dụng ASP.NET Web API với token và muốn cache các token tạm thời trên bộ nhớ để tránh lúc nào cũng phải vào cơ sở dữ liệu để truy xuất ra cho mỗi một request gửi lên.

Cách làm rất đơn giản. Bạn chỉ cần sử dụng một Class được xây dựng sẵn gọi là MemoryCache nằm trong thư viện System.Runtime.Caching dll.

Trước khi sử dụng được class MemoryCache bạn cần Add Reference đến thư viện này:

Tôi đã tạo một class tiện ích cho việc caching:

public class MemoryCacheHelper
    {
        /// <summary>
        /// Get cache value by key
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static object GetValue(string key)
        {
            return MemoryCache.Default.Get(key);
        }

        /// <summary>
        /// Add a cache object with date expiration
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="absExpiration"></param>
        /// <returns></returns>
        public static bool Add(string key, object value, DateTimeOffset absExpiration)
        {
            return MemoryCache.Default.Add(key, value, absExpiration);
        }

        /// <summary>
        /// Delete cache value from key
        /// </summary>
        /// <param name="key"></param>
        public static void Delete(string key)
        {
            MemoryCache memoryCache = MemoryCache.Default;
            if (memoryCache.Contains(key))
            {
                memoryCache.Remove(key);
            }
        }
    }

Và khi bạn muốn caching thứ gì đó, chỉ cần add nó vào cache với một cái key duy nhất và giá trị của cache:

            MemoryCacheHelper.Add("topProducts",new List<string>() { "A"}, DateTimeOffset.UtcNow.AddHours(1));

Và khi sử dụng chỉ cần get ra theo key đó:

 var topProducts = MemoryCacheHelper.GetValue("topProducts");

Chú ý: Bạn nên nhớ là MemoryCache sẽ được xóa mỗi khi IIS app pool được làm mới (recycle)

Nếu Web API của bạn :

  • Không nhận được bất cứ request nào trong vòng hơn 20 phút
  • Hoặc đặt thời gian mặc định cho IIS làm mới Pool là 1740 phút
  • Hoặc bạn deploy một bản build mới lên thư mục Web API được triển khai trên IIS

Thì bạn nên có một thao tác tay. Nếu bạn không lấy giá trị từ cache được thì bạn nên lấy nó từ database và sau đó gán lại vào cache:

var topProducts = MemoryCacheHelper.GetValue("topProducts");
            if (topProducts == null)
            {
                // for example get token from database and put grabbed token
                // again in memCacher Cache
                MemoryCacheHelper.Add("topProducts", new List<string>() { "A" }, DateTimeOffset.UtcNow.AddHours(1)));

            }

 


Trích nguồn từ: (blog.developers.ba)