Công nghệ - 08/06/2025 03:55:40
Khi tìm cách tối ưu hóa hiệu suất trong ứng dụng, điều đầu tiên tôi nghĩ đến là sử dụng cache.
Trong bài viết này, tôi sẽ đưa khái niệm cache, các phương án cache phổ biến, lợi thế của từng loại. Đồng thời, chúng ta cùng trải nghiệm ở code mẫu sử dụng C#, áp dụng DI tương tự như bài toán tìm kiếm để triển khai cache linh hoạt trong các bài toán cần sử dụng nhé.
Cache là kỹ thuật lưu trữ tạm thời dữ liệu được truy cập thường xuyên để giảm thời gian truy xuất, giảm tải cho hệ thống (như cơ sở dữ liệu, API) và cải thiện trải nghiệm người dùng. Trong ứng dụng .NET, cache có thể được áp dụng cho dữ liệu tĩnh, kết quả tính toán nặng, hoặc phản hồi từ dịch vụ bên ngoài.
Ví dụ: Thay vì truy vấn cơ sở dữ liệu mỗi khi người dùng muốn xem 1 sản phẩm, thay vì gọi trực tiếp vào database, ta lưu kết quả vào cache và tái sử dụng, tiết kiệm thời gian và tài nguyên.
Hay một ví dụ khác doanh thu hàng tháng, ta lưu vào cache để khỏi phải tổng hợp mỗi lần client gọi đến - ví dụ này nghe hơi phi lý phải không? Bạn hãy trả lời câu hỏi này, sử dụng phương án nào, sau khi đã đọc những phương án cache dưới đây nhé.
Dưới đây là các phương án cache phổ biến trong phát triển .NET, cùng lợi thế của từng loại:
1. In-Memory Cache (Bộ nhớ trong)
Mô tả: Lưu trữ dữ liệu trong bộ nhớ RAM của ứng dụng. .NET cung cấp IMemoryCache trong thư viện Microsoft.Extensions.Caching.Memory.
Lợi thế:
Hạn chế: Không chia sẻ được giữa các máy chủ trong môi trường phân tán; dung lượng giới hạn bởi RAM.
2. Distributed Cache (Cache phân tán)
Mô tả: Lưu trữ dữ liệu trên một hệ thống riêng biệt (như Redis, Memcached) để nhiều máy chủ có thể truy cập. .NET hỗ trợ qua IDistributedCache trong Microsoft.Extensions.Caching.Abstractions.
Lợi thế:
Hạn chế: Yêu cầu cài đặt và quản lý server riêng (Redis, Memcached), độ trễ cao hơn so với in-memory.
3. File-Based Cache (Cache dựa trên tệp)
Mô tả: Lưu dữ liệu vào tệp trên đĩa, thường dùng cho dữ liệu ít thay đổi hoặc cần lưu lâu dài.
Lợi thế:
Hạn chế: Tốc độ chậm hơn do I/O đĩa, không phù hợp cho dữ liệu cần truy cập nhanh hoặc môi trường phân tán.
4. Hybrid Cache (Cache kết hợp)
Mô tả: Kết hợp in-memory và distributed cache, ví dụ: lưu dữ liệu nóng (hot data) trong bộ nhớ, dữ liệu ít dùng hơn trong Redis.
Lợi thế:
Hạn chế: Phức tạp hơn để triển khai và quản lý.
Để thống nhất cách sử dụng các loại cache, tôi sẽ thiết kế một giao diện ICacheService làm wrapper, cho phép dễ dàng chuyển đổi giữa các phương án cache mà không thay đổi mã gọi. Dưới đây là mã mẫu và giải thích.
Interface này định nghĩa các phương thức cơ bản cho cache: lưu, lấy, và xóa.

Sử dụng IMemoryCache từ Microsoft.Extensions.Caching.Memory.

Sử dụng IDistributedCache với Redis làm ví dụ - cần cài đặt package Microsoft.Extensions.Caching.StackExchangeRedis.

Lưu trữ dữ liệu vào tệp trên đĩa, sử dụng JSON để tuần tự hóa.

Dưới đây là cách tích hợp ICacheService vào ứng dụng, sử dụng Dependency Injection (DI) trong .NET.

Khi một cache item phổ biến (ví dụ: trang chủ, sản phẩm hot) hết hạn, nếu có nhiều request đến cùng lúc, tất cả chúng sẽ thấy cache miss và cùng lúc gọi vào hàm lấy dữ liệu gốc (_repository.GetByIdAsync). Điều này tạo ra một đỉnh tải đột ngột lên hệ thống lõi.

Cache là một công cụ mạnh mẽ để tăng tốc ứng dụng, và việc chọn phương án phù hợp (in-memory, distributed, file-based, hoặc hybrid) phụ thuộc vào nhu cầu của bạn: tốc độ, khả năng mở rộng, hay độ bền.
Đồng thời, với interface ICacheService, bạn có thể xây dựng hệ thống linh hoạt, dễ bảo trì và chuyển đổi giữa các loại cache mà không làm gián đoạn mã hiện tại.
Bạn đã sử dụng cache trong dự án như thế nào? Phương án yêu thích của bạn là gì? Hãy chia sẻ kinh nghiệm để cộng đồng cùng học hỏi trong phần bình luận nhé!
/Son Do - I share real-world lessons, team building & developer growth.
#DotNet #Caching #SoftwareArchitecture #CleanCode #performanceoptimization #wecommit100xshare #1percentbetter
Công nghệ - 19/08/2025 21:13:07
Tìm hiểu cách xây dựng hệ thống phát hiện ngôn ngữ ký hiệu theo thời gian thực bằng AI, sử dụng DETR để tăng cường khả năng tiếp cận và đổi mới. Kết nối lời nói và cử chỉ.
Công nghệ - 18/08/2025 13:38:25
Tối ưu hóa các hệ thống RAG bằng cách tận dụng siêu dữ liệu để truy xuất thông tin chính xác và nhanh chóng hơn, giải quyết các thách thức về dữ liệu dư thừa hoặc lỗi thời với công cụ LangExtract nguồn mở. Khám phá cách LangExtract sử dụng các mô hình ngôn ngữ tiên tiến để trích xuất và cấu trúc siêu dữ liệu, tạo ra một quy trình truy xuất hợp lý và hiệu quả.
Công nghệ - 01/08/2025 07:00:00
Gỡ lỗi LLM rất quan trọng vì quy trình làm việc của chúng phức tạp và liên quan đến nhiều phần như chuỗi, lời nhắc, API, công cụ, trình truy xuất, v.v.
Công nghệ - 19/06/2025 03:05:09
Code xong chạy được là chưa đủ – phải biết khi nào nó "chết" nữa chứ 😅
Bạn đang triển khai ứng dụng trên Kubernetes, Docker hay môi trường production nào? Và bạn từng "toát mồ hôi" vì service chết mà không ai báo?
Công nghệ - 16/07/2025 13:41:17
Công nghệ - 27/06/2025 03:15:44
Công nghệ - 11/12/2025 15:05:29
[Góc chuyện nghề] bán account game để đi học nghệ - bạn dám không?
Làm nghề 20 năm, gặp nhiều sinh viên, nhưng chiều qua tôi khá bất ngờ với một cậu em tên Quang. Em Quang muốn theo nghề BA và mong muốn lương 20 triệu sau khi làm việc 1.5 năm tới 2 năm trong nghề.
Công nghệ - 22/09/2025 08:59:20
Dừng ngay việc dùng DateTime.Now trong APIs, đó là ổ lỗi tiềm ẩn trong hệ thống của bạn
⏱️ Tôi từng nghĩ DateTime.Now là một thứ vô hại, đơn giản và tiện lợi, cho đến khi gặp những vấn đề về múi giờ. Những lỗi "tưởng chừng nhỏ" này lại chính là nguồn cơn của sự thất vọng và tốn kém thời gian cho nhiều đội ngũ phát triển.
Công nghệ - 14/03/2025 04:30:32