Memory cache là gì?
QuyDX

QuyDX

30/01/2023

Memory cache là gì?

1. Memory cache là gì: In-memory cache sử dụng bộ nhớ(RAM) của máy server để lưu trữ data. Những data nào thường được lưu cache thỏa mãn 2 yếu tố: data được truy cập thường xuyên và ít thay đổi.

Mục đích của sử dụng memory cache hay bất kỳ loại cache nào là đều muốn cải thiện hiệu suất chương trình.

Ví dụ: lấy ra danh sách 100 sản phẩm bán chạy mỗi tháng. (dữ liệu này thỏa mãn tiêu chí ít thay đổi (1 tháng thay đổi 1 lần) + truy cập thường xuyên khi người dùng filter danh sách sản phẩm bán chạy). Ta có thể lưu cache cho data này để giảm thời gian truy cập xuống database để lấy dữ liệu.

Lưu ý: In-memory cache phù hợp cho 1 server duy nhất hoặc nhiều server có sử dụng sticky sessions.

Chỗ này mình sẽ giải thích sơ qua sticky session là gì?(Phần này liên quan đến kiến thức về load balancin) . Sticky session là một trong những tính năng cơ bản của load balancing cho phép định tuyến một máy chủ đơn lẻ cho một người dùng cụ thể, dựa trên HTTP session hoặc IP của họ.

Tại sao mình phải lưu ý vấn đề ở trên:

  • Nếu chỉ có 1 máy server thì khi ta lưu cache chỉ lưu trên bộ nhớ của máy server duy nhất đó => không xảy ra vấn đề gì.
  • Trong trường hợp có nhiều máy server (thông thường các hệ thống lớn đều xài multiple servers). Server A, B, C, D.... Khi ta lưu cache thì ta sẽ chỉ lưu ở một máy server A. Vậy khi lấy cache ra làm sao biết được ta sẽ lấy ở máy server nào trong nhiều servers. Sticky session sẽ giúp ta làm việc đó.

Thêm 1 lưu ý khi sử dụng nếu ta lưu quá nhiều memory cache thì sẽ tốn dung lượng lưu trữ dẫn đến server bị chậm.

2. Thực hành sử dụng memory cache trong .net core

Phần này để hiểu được cần có kiến thức cơ bản về c# và .net core

Trong .net core có hỗ trợ sẵn memory cache(IMemoryCache) vậy nên ta không cần phải xài third party.

  • Cấu hình service memory cache để sử dụng:
public void ConfigureServices(IServiceCollection services) {
    services.AddRazorPages();
    services.AddMemoryCache();
}
  • Sử dụng dependence injection để inject IMemoryCache
public class IndexModel : PageModel {
    private readonly ILogger<IndexModel> _logger;
    private IMemoryCache cache;
    public IndexModel(ILogger<IndexModel> logger, IMemoryCache cache) {
        _logger = logger;
        this.cache = cache;
    }
}
  • Set data cho cache bao gồm key và value(value có thể là kiểu int, string, double, object...)
 cache.Set<string>("timeCache", DateTime.Now.ToString());
var listUser = new List<User>() {
    new User {
        Id = 1,
        Name = "Iron man"
    },
    new User {
        Id = 2,
        Name = "Spider man"
    }
};
cache.Set<List<User>>("ListUser", listUser);
  • Lấy dữ liệu từ cache ta dùng phương thức get
ViewData["expiredCache"] = cache.Get<string>("expiredCache");
  • Sử dụng tryGet để kiểm tra sự tồn tại của key
if (!cache.TryGetValue<string>("timeCache", out string timeCache)) {
    ViewData["ExistingCache"] = "Cache với key: timeCache không tồn tại";
    cache.Set<string>("timeCache", DateTime.Now.ToString());
} else {
    ViewData["ExistingCache"] = $"Cache với key: timeCache đã tồn tại với value: {timeCache}";
}
  • Sử dụng GetOrCreate để tạo 1 cache mới nếu chưa tồn tại
var timeCacheGetOrCreate = cache.GetOrCreate<string>("timeCacheGetOrCreate", entry => {
    return DateTime.Now.ToString();
});
  • Xóa cache
cache.Remove("expiredCache");

Source demo: https://github.com/TechMarDay/Cache

Tham khảo: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-5.0

Để lại bình luận của bạn

Chủ đề