Chắc hẳn, việc nhắc đến Cache hay Caching đã không còn quá xa lạ với nhiều người. Từ lúc tôi bắt đầu đi làm đến giờ, tôi thường hay được nghe đồng nghiệp nhắc về nó như một điều gì đó không thể thiếu trong hệ thống. Nó giống như việc bạn sẽ mặc một bộ đồ lộng lẫy để bước ra sân khấu trình diễn.
Tags:Một ngày đầu năm 2025, khi tôi đọc qua một số bài viết nói về thiết kế hệ thống, chắc hẳn mọi người khi nhắc về việt thiết kế hệ thống, mọi người sẽ nghĩ ngay đến những việc như là sẽ chia services thế nào, có dùng chung database hay không. Và hiển nhiên, mọi người cũng sẽ nhắc đến Cache hay Caching, một thứ mà bây giờ đã không còn quá xa lạ. Từ lúc tôi bắt đầu đi làm đến giờ, tôi thường hay được nghe đồng nghiệp nhắc về nó như một điều gì đó không thể thiếu trong hệ thống. Nó giống như việc bạn sẽ mặc một bộ đồ lộng lẫy để bước ra sân khấu trình diễn.
Tất nhiên, khi một lý thuyết, một khái niệm được sinh ra thì chắc chắn nó phải có một lý do gì đấy. Thì về khái niệm Caching cũng thế. Nhưng tôi tự hỏi, liệu có bao nhiêu người thực sự hiểu về Caching, cái sự hiểu ở đây mà tôi muốn nói đến đó là việc người ta nắm được tại sao chúng ta cần Cache, khi nào chúng ta sẽ áp dụng nó và câu trả lời quan trọng nhất "Liệu hệ thống của chúng ta có thực sự cần Caching?"
Tôi đã từng khá tò mò về việc từ khi nào thế giới loại người lại bắt đầu cái khái niệm "khỉ gió" này. Thì tôi nhận ra, có vẻ mọi người thực sự chỉ muốn biết làm sao để áp dụng Caching chứ chưa thực sự hứng thú tìm hiểu về nó. À mà thôi, chém gió và giận dữ đến đây đủ rồi.
Thì tóm tắt lại, thì câu chuyện bắt đầu từ những ngày đầu của ngành máy tính, khi hệ thống còn đơn giản và nhu cầu truy cập dữ liệu chưa cao, tất nhiên rồi, cái thời một chiếc máy tính bằng cả gia tài thì làm sao mà cao được chứ. Nhưng rồi, khi ngày càng nhiều người dùng dựa vào tài nguyên máy tính và các ứng dụng trở nên “ngốn” dữ liệu hơn, những thách thức về hiệu năng lúc này cũng đã xuất hiện. Việc truy cập dữ liệu từ bộ nhớ chính như ổ cứng trở thành nút thắt cổ chai vì độ trễ cao.
Và thế là ý tưởng về caching ra đời - một giải pháp để thu hẹp khoảng cách giữa các bộ vi xử lý siêu nhanh và cơ chế truy xuất dữ liệu chậm hơn. Caching giúp tăng tốc độ truy cập vào những dữ liệu được sử dụng thường xuyên, từ đó giảm thời gian phản hồi và nâng cao hiệu suất tổng thể.
Chúng ta sẽ ôn lại một chút về khái niệm bộ nhớ của máy tính. Bộ nhớ trong máy tính đóng vai trò cực kỳ quan trọng trong việc xử lý dữ liệu. Có nhiều loại bộ nhớ khác nhau, được phân loại từ nhanh đến chậm dựa trên tốc độ truy cập và chi phí. Mà nhắc đến đây tôi lại nhớ đến một câu khá hay mà tôi đã được nghe.
Trong máy tính, lưu trữ dữ liệu thường tuân theo một quy tắc khá đơn giản "Cái gì càng lớn thì càng chậm, càng rẻ"
Về mặt bộ nhớ cache của bộ vi xử lý, luôn có sự đánh đổi giữa tốc độ truy cập, dung lượng và chi phí. Việc di chuyển dữ liệu từ các cấp thấp hơn trong cấu trúc bộ nhớ lên CPU là rất tốn kém. Vì vậy, điều quan trọng là phải giữ dữ liệu được sử dụng thường xuyên gần với CPU. Để làm được điều này, bộ nhớ cache hiện nay được sử dụng trong các máy tính.
Việc "tốn kém" ở đây, chúng ta có thể hiểu là:
Bạn sẽ cười vì tôi đang nói đến một vấn đề có vẻ không liên quan lắm đến chủ đề này đúng không? Nhưng cứ bình tĩnh nhé, hãy nhớ câu này, chúng ta sẽ phải nhắc lại nó nhiều đấy
Dưới đây là một cái nhìn tổng quan về các loại bộ nhớ này, từ nhanh nhất đến chậm nhất:
Vì vậy, "tốn kém" ở đây không chỉ là chi phí về mặt vật lý mà còn là sự giảm hiệu suất và tăng độ trễ khi dữ liệu không thể được truy xuất trực tiếp từ các bộ nhớ nhanh hơn như cache hoặc register.
Caching là một cách lưu trữ thông tin để có thể truy xuất nhanh chóng mà không cần phải liên tục truy xuất hay tính toán lại từ nguồn gốc, miễn là dữ liệu đó không thay đổi thường xuyên. Caching hiện diện khắp mọi nơi từ máy tính cho đến ngoài đời sống, thậm chí nó tồn tại trong chính tư duy của mỗi chúng ta. Mọi người thường giải thích caching theo cách nói về bộ nhớ cache của trang web, nhưng caching không chỉ có vậy. Có thể hiểu rằng Caching là một khái niệm rộng lớn hơn nhiều. Nên bạn đừng bó hẹp nó trong một phạm vi nhỏ về mặt hệ thống hay gắn chặt nó với Redis hay Memcached...
Hãy tưởng tượng một ví dụ quen thuộc: trình duyệt của bạn lưu trữ một bản sao của trang web trong bộ nhớ cache. Vì trang đó không thay đổi mỗi vài phút, việc lưu trữ cục bộ giúp bạn tải lại nhanh hơn và tiết kiệm băng thông mỗi khi nhấn nút "tải lại". Nhưng caching không chỉ dừng ở đó. Cache cơ sở dữ liệu, cache đĩa hay thậm chí cache trong các hệ thống phân tán đều góp phần cải thiện tốc độ và hiệu quả truy xuất dữ liệu trong nhiều tình huống khác nhau. Caching, nói một cách đơn giản, là bí quyết để mọi thứ vận hành nhanh hơn.
Mặc dù có nếu phân tích quá sâu về mặt công nghệ hay kỹ thuật về caching có thể khá phức tạp, nhưng ý tưởng cơ bản của Caching rất đơn giản. Nếu tôi hỏi bạn kết quả của phép tính 6 nhân 9 bằng bao nhiêu, bạn sẽ biết ngay đáp án là 54 đúng không? Tôi đoán là bạn sẽ không cần phải tính toán lại vì chắc chắn chúng ta đã làm phép nhân này quá nhiều trong cuộc sống nên lúc này chỉ cần nhớ kết quả mà không cần phải xử lý tư duy. Đó chính là cách hoạt động của Caching.
Chúng ta đã nói về khái niệm cũng như nền tảng của Caching. Bây giờ chúng ta hãy nói về việc áp dụng Caching trong thiết kế hệ thống.
Bắt đầu với việc khi một người dùng gửi một yêu cầu đến hệ thống, về cơ bản hệ thống sẽ cần thực hiện một số công việc đại loại thế này:
Bỏ qua các yếu tố bên ngoài như mạng chậm hay xử lý đặc biệt gì đó, thường thì phần (3) sẽ là phần sẽ làm "tốn kém" cho hệ thống nhất, vì ở bước này chúng ta sẽ thực hiện những công việc về nghiệp vụ hoặc những thuật toán hay những câu lệnh phức tạp ở đây.
Lúc này có một câu hỏi đặt ra
Liệu hệ thống có cần phải xử lý tất cả yêu cầu không?
Thì lúc này, hãy nhớ lại phần trên, nếu tôi hỏi bạn 6 x 9 bằng bao nhiêu, tôi cá là bạn đọc đến đây thì bạn có thể trả lời ngay cho tôi là 54 phải không?
Đúng rồi, Caching lúc này phát huy tác dụng, theo ý tưởng trên thì chúng ta không nhất thiết phải xử lý lại những yêu cầu giống nhau, những yêu cầu giống nhau chúng ta sẽ trả về cùng 1 kết quả đúng không nào. Đến đây, thì chúng ta sẽ có một cái nhìn mới khi áp dụng Caching.
Khi một yêu cầu được gửi đến một hệ thống đã có áp dụng Caching, lúc này có hai kịch bản có thể xảy ra
Hiệu suất của cache được đo bằng số lượng cache hit so với tổng số yêu cầu.
Thường thì các phần mềm caching hiện nay như Redis, MemCached hay các công cụ Caching có một số điểm mạnh như sau:
Lợi ích chính của việc sử dụng Caching là tốc độ. Việc đọc dữ liệu từ bộ nhớ đệm nhanh hơn rất nhiều so với truy xuất trực tiếp từ cơ sở dữ liệu (như SQL hay Mongo). Tốc độ này đến từ việc bộ nhớ đệm sử dụng các cấu trúc dữ liệu như dictionary (hoặc HashMap) để thực hiện các thao tác nhanh chóng và lưu trữ dữ liệu trong bộ nhớ tốc độ cao thay vì trên ổ đĩa.
Thứ hai, caching giúp giảm tải cho cơ sở dữ liệu. Điều này cho phép ứng dụng lấy dữ liệu từ bộ nhớ đệm thay vì liên tục truy cập vào cơ sở dữ liệu. Nhờ đó, việc sử dụng tài nguyên phần cứng giảm đáng kể; thay vì tìm kiếm dữ liệu trên ổ đĩa, hệ thống chỉ cần truy cập dữ liệu từ bộ nhớ nhanh.
Những lợi ích này cải thiện trực tiếp trải nghiệm người dùng và có thể tiết kiệm chi phí. Ứng dụng của bạn phản hồi nhanh hơn, mang lại trải nghiệm mượt mà và hài lòng hơn cho người dùng.
Caching còn giúp giảm chi phí cơ sở hạ tầng. Mặc dù một hệ thống phân tán như Redis cần sử dụng tài nguyên riêng, nhưng tổng chi phí tiết kiệm thường khá lớn. Ứng dụng của bạn truy cập dữ liệu hiệu quả hơn, thậm chí có thể giảm quy mô cơ sở dữ liệu. Tuy nhiên, điều này đi kèm với rủi ro: nếu hệ thống bộ nhớ đệm gặp sự cố, hãy đảm bảo cơ sở dữ liệu của bạn sẵn sàng xử lý tải tăng đột biến.
Như phần trên tôi đã nói, về cơ bản thì khi một yêu cầu đến hệ thống thì sẽ có 2 trường hợp xảy ra, thì lúc này chúng ta cũng có 2 loại Caching Pattern. Những pattern này cung cấp các chiến lược để quản lý việc cập nhật cache và xử lý khi dữ liệu cần thiết chưa có trong cache
Các Writing Pattern biểu diễn cách ứng dụng của bạn tương tác với cả bộ nhớ đệm (cache) và cơ sở dữ liệu.
Chúng ta có ba chiến lược phổ biến:
Mỗi chiến lược đều có những ưu điểm và đánh đổi riêng
Write-back
Cách hoạt động:
Phù hợp với: Ứng dụng cần tốc độ cao trong việc ghi dữ liệu, nơi có thể chấp nhận sự không đồng bộ tạm thời, như hệ thống phân tích hoặc đo lường.
Ưu điểm:
Nhược điểm:
Write-through (Ghi Đồng Thời)
Cách hoạt động:
Ưu điểm:
Nhược điểm:
Write-around (Ghi Bỏ Qua Cache)
Cách hoạt động:
Ưu điểm:
Nhược điểm:
Cache miss xảy ra khi dữ liệu cần thiết không có trong cache. Dưới đây là hai chiến lược phổ biến để xử lý tình huống này:
Điểm nổi bật:
Điểm nổi bật: Ứng dụng chịu trách nhiệm quản lý cache. Đây là phương pháp phổ biến nhất vì dễ triển khai và không cần thay đổi nhiều ở các hệ thống khác ngoài ứng dụng
Ưu điểm: Giảm phức tạp cho ứng dụng, vì cache được quản lý bởi hệ thống trung gian.
Nhược điểm: Tăng độ phức tạp của hạ tầng. Tuy nhiên, phương pháp này giúp giảm tải cho tài nguyên ứng dụng