Cache là một trong những cách phổ biến nhất để cải thiện tốc độ web/app. Thay vì tính toán lại hoặc truy vấn database nhiều lần cho cùng một dữ liệu, ứng dụng lưu kết quả tạm thời rồi dùng lại. Nghe đơn giản, nhưng nếu làm không cẩn thận, cache có thể khiến người dùng thấy giá cũ, trạng thái đơn hàng sai hoặc dữ liệu vừa cập nhật mà mãi không hiện ra. Một ví dụ thực tế: trang danh sách sản phẩm thường được truy cập nhiều, trong khi thông tin sản phẩm không thay đổi từng giây. Ta có thể cache kết quả danh sách trong 1-5 phút để giảm tải database. Nhưng với số lượng tồn kho hoặc giá khuyến mãi, cần cân nhắc kỹ hơn vì dữ liệu sai có thể ảnh hưởng trực tiếp đến giao dịch. Một vài kiểu cache thường gặp: - Cache phía trình duyệt: dùng cho ảnh, CSS, JS hoặc dữ liệu ít thay đổi. Cần đặt version cho file tĩnh, ví dụ app.v2.css, để tránh người dùng bị kẹt ở bản cũ. - Cache phía server: lưu kết quả truy vấn, HTML fragment hoặc response API. Phù hợp với dữ liệu đọc nhiều, ghi ít. - Cache qua CDN: hữu ích với website có người dùng ở nhiều khu vực, đặc biệt cho ảnh, file tĩnh, trang public. - Cache trong bộ nhớ như Redis/Memcached: thường dùng cho session, dữ liệu tạm, kết quả tính toán, rate limit. Nguyên tắc quan trọng nhất là xác định dữ liệu nào được phép “cũ trong một khoảng thời gian”. Không phải mọi thứ đều nên cache. Hồ sơ người dùng, quyền truy cập, số dư ví, trạng thái thanh toán là các nhóm dữ liệu cần cẩn trọng. Nếu cache, phải có chiến lược làm mới rõ ràng. Có ba cách xử lý cache phổ biến: 1. Đặt thời gian hết hạn Ví dụ cache danh sách bài viết trong 60 giây. Cách này dễ làm, ít rủi ro nếu dữ liệu không quá nhạy cảm. Nhược điểm là sau khi cập nhật, người dùng vẫn có thể thấy dữ liệu cũ cho đến khi cache hết hạn. 2. Xóa cache khi dữ liệu thay đổi Khi admin sửa sản phẩm, hệ thống xóa cache liên quan đến sản phẩm đó hoặc danh sách sản phẩm. Cách này cho dữ liệu mới nhanh hơn, nhưng cần quản lý key cache cẩn thận. Nếu quên xóa một key, lỗi sẽ rất khó tìm vì database đúng nhưng giao diện vẫn sai. 3. Cache-aside Ứng dụng kiểm tra cache trước. Nếu có thì dùng. Nếu không có thì truy vấn database, sau đó ghi kết quả vào cache. Đây là mô hình dễ hiểu và được dùng nhiều. Tuy nhiên cần xử lý tình huống nhiều request cùng lúc đều thấy cache trống rồi đồng loạt truy vấn database. Một số lời khuyên có thể áp dụng ngay: - Đặt tên key cache có quy ước, ví dụ product:123, category:list:page:1, user:456:permissions. - Đừng cache dữ liệu theo người dùng mà quên gắn user ID vào key, nếu không có thể lộ dữ liệu giữa các tài khoản. - Với dữ liệu quan trọng, ưu tiên đúng trước, nhanh sau. - Ghi log khi cache miss bất thường để phát hiện key sai hoặc cache bị xóa liên tục. - Đo trước và sau khi cache. Nếu endpoint vốn đã nhanh, thêm cache có thể làm hệ thống phức tạp hơn mà lợi ích không đáng kể. - Chuẩn bị cách “bỏ qua cache” cho admin hoặc khi cần kiểm tra lỗi. Cache không phải cây đũa thần. Nó là một lớp tối ưu cần được thiết kế như một phần của hệ thống. Hãy bắt đầu từ những nơi đọc nhiều, dữ liệu ít thay đổi và rủi ro thấp. Khi đã có quy ước rõ ràng về thời gian sống, cách xóa cache và cách đặt key, cache sẽ giúp ứng dụng nhanh hơn mà không tạo thêm những lỗi mơ hồ khiến cả đội mất thời gian lần mò.