Bộ nhớ đệm (caching) là gì? Hướng dẫn dễ hiểu cho người xây dựng ứng dụng
Caching nghĩa là giữ một bản sao sẵn có của thứ gì đó, thứ mà trước đó lấy về rất chậm hoặc tốn kém, để yêu cầu tiếp theo có thể được trả lời nhanh chóng từ bản sao đó. Bản sao đã lưu được gọi là cache (bộ nhớ đệm). Trình duyệt của bạn cache hình ảnh để một trang web tải nhanh hơn ở lần truy cập thứ hai; một server cache kết quả của một truy vấn cơ sở dữ liệu chậm để không phải chạy lại cho mỗi khách truy cập.
Caching giúp ứng dụng nhanh hơn và rẻ hơn khi vận hành. Đánh đổi lớn nhất của nó là một bản sao có thể bị lỗi thời.
Vì sao caching quan trọng khi bạn xây dựng bằng AI
Bạn sẽ gặp caching trong các ứng dụng xây bằng AI theo ba cách:
- "Tôi đã cập nhật ứng dụng nhưng vẫn thấy phiên bản cũ." Đây là tình huống caching gặp phổ biến nhất, và thường là vô hại: trình duyệt hoặc CDN của bạn đang hiển thị một bản sao đã lưu.
- Tốc độ. Nếu một trang chậm vì phải tính lại cùng những con số cho mỗi khách truy cập, việc cache kết quả có thể khiến trang gần như tức thì.
- Chi phí. Nhiều công cụ xây dựng bằng AI và nền tảng hosting tính phí cho tài nguyên tính toán, thời gian cơ sở dữ liệu và các lệnh gọi API bên ngoài. Nếu một nghìn khách truy cập cùng kích hoạt một yêu cầu tốn kém, caching cho phép bạn chỉ trả tiền một lần.
Hiểu những điều cơ bản giúp bạn yêu cầu caching ở nơi nó hữu ích, và nhận ra nó khi chính nó là nguyên nhân khiến mọi thứ trông sai.
Một ví dụ đời thường
Hãy hình dung bếp của một quán cà phê đông khách.
Mỗi lần có khách gọi, đầu bếp có thể pha từng ly cà phê từ hạt vừa xay. Cách đó chậm. Thay vào đó, họ giữ sẵn một bình cà phê phin trên bếp hâm nóng. Hầu hết khách nhận được ly cà phê trong vài giây; đó là cache hit (trúng cache). Khi bình cạn, ai đó pha bình mới; đó là cache miss (trượt cache).
Nhưng cà phê để quá lâu sẽ bị nhạt, nên quán có quy định: bỏ bất kỳ bình nào cũ hơn 30 phút. Quy định đó là thời gian hết hạn của cache. Không ai giữ cùng một bình cả ngày, và không ai pha sẵn một đơn đặc biệt của khách, như cà phê sữa yến mạch với ba muỗng đường. Một số thứ không nên cache chút nào.
Cache nằm ở đâu
Một lần tải trang có thể đi qua nhiều cache, từ gần người dùng nhất đến xa nhất:
| Cache | Vị trí | Thường lưu gì | Ví dụ |
|---|---|---|---|
| Cache trình duyệt | Trên thiết bị của khách truy cập | Hình ảnh, stylesheet, script, phông chữ | Logo của bạn tải ngay lập tức ở trang thứ hai |
| Cache CDN | Các server trên khắp thế giới, gần khách truy cập | Tệp tĩnh và đôi khi cả trang | Khách ở Tokyo nhận tệp từ một server gần đó, không phải từ gốc của bạn |
| Cache ứng dụng | Trên hoặc cạnh server, thường trong bộ nhớ hoặc Redis | Kết quả của truy vấn chậm hoặc lệnh gọi API bên ngoài | Tỷ giá hối đoái hôm nay, lấy một lần mỗi giờ |
| Cache cơ sở dữ liệu | Bên trong cơ sở dữ liệu | Dữ liệu mới được dùng gần đây và kế hoạch truy vấn | Các hàng phổ biến được giữ trong bộ nhớ nhanh |
Một CDN (mạng phân phối nội dung) về cơ bản là một mạng lưới cache trên toàn thế giới cho các tệp của website bạn.
Cache quyết định giữ gì như thế nào
Mỗi cache đều phải trả lời những câu hỏi giống nhau:
- Cái gì có thể được cache? Dữ liệu công khai, dùng chung (ảnh sản phẩm, bài viết blog): có. Dữ liệu riêng tư (trang tài khoản của người dùng, tin nhắn của họ): không bao giờ đưa vào cache dùng chung.
- Trong bao lâu? Đây là TTL (time to live, thời gian sống). Một logo có thể được cache trong một năm; số lượng tồn kho có thể chỉ 30 giây.
- Được cập nhật bằng cách nào? Hoặc bản sao hết hạn và được tải lại, hoặc ứng dụng chủ động xóa nó khi dữ liệu thay đổi, gọi là invalidation (vô hiệu hóa cache).
Với website, server cho trình duyệt và CDN biết cách cache từng tệp thông qua header Cache-Control. Ví dụ, Cache-Control: max-age=3600 nghĩa là "bạn có thể dùng lại bản sao này trong một giờ."
Các công cụ build hiện đại xử lý phần khó nhất với tệp tĩnh bằng cache busting (làm mới cache): mỗi khi một tệp thay đổi, nó được đặt một tên mới có dấu vân tay, chẳng hạn app.3f9a2c.js. Trình duyệt có thể cache tên cũ trong thời gian dài, vì phiên bản mới đơn giản là có tên khác.
Ví dụ minh họa: danh mục sản phẩm
Bạn có một cửa hàng trực tuyến nhỏ. Trang chủ hiển thị 50 sản phẩm với giá và số lượng tồn kho lấy từ cơ sở dữ liệu, cùng một danh sách "xu hướng" cần một phép tính chậm trên toàn bộ đơn hàng.
- Hình ảnh và script được trình duyệt và CDN cache trong thời gian dài. Mỗi bản build mới đặt tên mới cho các tệp đã thay đổi, nên cập nhật vẫn hiển thị.
- Danh sách xu hướng được tính mỗi 10 phút một lần và lưu trong cache ứng dụng. Mọi khách truy cập trong 10 phút đó nhận kết quả đã lưu ngay lập tức.
- Giá được cache trong thời gian ngắn, và cache bị xóa mỗi khi bạn chỉnh sửa một sản phẩm, nên khách hàng không bao giờ thấy giá cũ quá lâu.
- Tồn kho tại bước thanh toán không bao giờ được cache. Khi ai đó nhấn "Mua", ứng dụng kiểm tra cơ sở dữ liệu thật, nên không thể bán một món vừa hết hàng.
- Trang giỏ hàng và tài khoản không bao giờ được lưu trong cache dùng chung, vì chúng mang tính cá nhân.
Kết quả: trang chủ nhanh, cơ sở dữ liệu làm việc ít hơn nhiều, và không có gì liên quan đến tiền bạc hay quyền riêng tư bị lỗi thời.
Thuật ngữ quan trọng
| Thuật ngữ | Ý nghĩa |
|---|---|
| Cache hit / miss | Dữ liệu được tìm thấy trong cache / phải lấy từ nguồn gốc. |
| TTL (time to live) | Khoảng thời gian một bản sao đã lưu được coi là còn mới. |
| Stale data (dữ liệu cũ) | Một bản sao đã lưu nhưng đã lỗi thời. |
| Invalidation (vô hiệu hóa) | Chủ động xóa một bản sao đã lưu vì bản gốc đã thay đổi. |
| Cache busting | Đổi tên hoặc URL của tệp khi nó thay đổi, để cache tải phiên bản mới. |
| Cache-Control | Header HTTP cho trình duyệt và CDN biết cách cache một phản hồi. |
| Làm mới cứng (hard refresh) | Tải lại trang và yêu cầu trình duyệt bỏ qua cache của nó. |
| Redis | Kho dữ liệu trong bộ nhớ phổ biến, thường được dùng làm cache ứng dụng. |
Những hiểu lầm thường gặp
- "Caching luôn tốt." Cache sai thứ sẽ gây ra lỗi thật: giá cũ, bài viết mới không hiện, hoặc tệ nhất là trang riêng tư của người dùng này hiển thị cho người khác. Hãy cache có chủ đích.
- "Nếu tôi thấy phiên bản cũ, nghĩa là cập nhật của tôi đã thất bại." Thường thì không. Hãy thử làm mới cứng (Ctrl+Shift+R, hoặc Cmd+Shift+R trên Mac) hoặc mở cửa sổ riêng tư trước khi kết luận có gì đó hỏng.
- "Caching sửa được một ứng dụng chậm." Nó chỉ che đi sự chậm chạp đối với các yêu cầu lặp lại. Yêu cầu đầu tiên vẫn chậm, và nếu vấn đề gốc là thiếu chỉ mục cơ sở dữ liệu thì cũng phải sửa phần đó.
- "Tôi nên cache mọi thứ càng lâu càng tốt." Thời gian cache dài phù hợp với các tệp được đặt tên mới khi thay đổi. Với trang HTML và dữ liệu, thời gian ngắn hơn an toàn hơn.
- "Xóa cache của tôi sẽ sửa được cho mọi người." Nó chỉ xóa cache của bạn. Khách truy cập và cache CDN vẫn giữ bản sao riêng của họ.
Nên yêu cầu công cụ xây dựng AI của bạn điều gì
- "Phần nào của ứng dụng này chậm, và phần nào có thể cache an toàn?"
- "Cache [danh sách xu hướng / kết quả API] trong [N] phút, và xóa nó khi dữ liệu gốc thay đổi."
- "Đảm bảo không trang nào chứa dữ liệu cá nhân hoặc tài khoản có thể được CDN hay cache dùng chung lưu lại."
- "Đặt thời gian cache dài cho các tệp tĩnh có dấu vân tay và thời gian ngắn cho HTML."
- "Cache phản hồi từ [API bên ngoài] để chúng ta không gọi nó ở mỗi lần tải trang, và cho tôi biết dữ liệu đó có thể cũ đến mức nào."
- "Sau khi xuất bản tôi thấy phiên bản cũ. Đó là cache trình duyệt của tôi, hay có thứ gì chưa được triển khai?"
Caching trong Mythex
Sau khi bạn xuất bản một bản cập nhật cho ứng dụng Mythex, tài liệu ghi nhận rằng cache CDN có thể chậm cập nhật trong thời gian ngắn, và làm mới cứng URL công khai sẽ hiển thị phiên bản mới. Xem Cách xuất bản. Trang Giới hạn hosting cũng khuyến nghị cache các tài nguyên tĩnh, vì hosting, thời gian cơ sở dữ liệu và băng thông đều được trừ từ số dư tín dụng của bạn. Ngoài phần đó, việc cache kết quả truy vấn hoặc phản hồi API là thứ bạn yêu cầu tác tử xây dựng vào ứng dụng.
Đọc thêm: CDN là gì, cách làm website nhanh hơn và rate limiting là gì.
Câu hỏi thường gặp
Bộ nhớ đệm (caching) là gì, nói đơn giản?
Caching nghĩa là lưu lại một bản sao của thứ mà trước đó lấy về rất chậm hoặc tốn kém, để lần sau cần đến nó có thể phục vụ nhanh từ bản sao đã lưu. Trình duyệt, CDN, server và cơ sở dữ liệu đều dùng cache để làm ứng dụng nhanh hơn và rẻ hơn khi vận hành.
Sao tôi vẫn thấy phiên bản cũ của website sau khi cập nhật?
Có khả năng trình duyệt hoặc CDN đang phục vụ bản sao đã lưu của các tệp cũ. Thường thì làm mới cứng (Ctrl+Shift+R trên Windows, Cmd+Shift+R trên Mac) sẽ khắc phục được. Đối với khách truy cập, các website được làm tốt sẽ đặt tên mới cho tệp đã cập nhật để cache tự động tải phiên bản mới.
Xóa cache có tác dụng gì?
Xóa cache trình duyệt sẽ xóa các bản sao tệp và trang đã được lưu, để lần tới trình duyệt tải lại mọi thứ từ đầu. Việc này có thể sửa các trang bị lỗi hiển thị hoặc đã cũ, và các trang sẽ tải chậm hơn một chút ở lần đầu tiên sau đó.
Bộ nhớ đệm có thể gây ra vấn đề không?
Có. Rủi ro chính là phục vụ dữ liệu đã lỗi thời, ví dụ một giá cũ hay số lượng tồn kho lỗi thời, hoặc tệ hơn là lưu vào cache một trang riêng tư của người dùng này rồi hiển thị cho người khác. Quy tắc caching tốt sẽ quyết định những gì được cache, trong bao lâu, và không bao giờ cache dữ liệu cá nhân trong các cache dùng chung.