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 sao 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ể.

Nền tảng Caching

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à:

1.Thời gian truy xuất lâu
2.Tiêu tốn năng lượng
3.Chi phí tính toán

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:

1.Register (Thanh ghi)
2.Cache Memory (Bộ nhớ đệm)
3.RAM (Random Access Memory - Bộ nhớ truy cập ngẫu nhiên)
4.Solid-State Drive (SSD) và Hard Disk Drive (HDD)
5.Optical Disc (Đĩa quang học)
6.Magnetic Tape (Băng từ)
cloudinary

ALT

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.

Caching trong thiết kế hệ thống

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:

1.Nhận yêu cầu
2.Bóc tách yêu cầu
3.Xử lý nghiệp vụ, logic, tính toán, truy cập dữ liệu... (Mất thời gian nhất)
4.Phản hồi trả về dữ liệu người dùng cần

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

Nếu một bản sao của dữ liệu đã tồn tại trong cache, đó gọi là cache hit
Khi không tồn tài dữ liệu trong cache, cần xử lý lại để có được dữ liệu đó, đó gọi là cache miss

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.

Giảm tải áp lực

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:

Sử dụng bộ nhớ tốc độ cao (RAM)RAM có tốc độ truy cập nhanh hơn rất nhiều so với ổ đĩa (HDD hoặc SSD), giúp giảm độ trễ đáng kể trong việc truy xuất dữ liệu.
Cấu trúc dữ liệu tối ưu: Bộ nhớ đệm thường sử dụng các cấu trúc dữ liệu hiệu quả như Dictionary (hoặc HashMap). Các cấu trúc này cho phép thực hiện các thao tác như truy xuất, thêm, hoặc xóa dữ liệu với độ phức tạp thời gian gần như O(1), làm cho các thao tác trở nên nhanh chóng và mượt mà.

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.

Writing Patterns

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

Writing Patterns

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:

Write-back (Ghi Ngược)
Write-through (Ghi Đồng Thời)
Write-around (Ghi Bỏ Qua Cache).

Mỗi chiến lược đều có những ưu điểm và đánh đổi riêng




Write-back

cloudinary

ALT

Cách hoạt động:

Ứng dụng chỉ tương tác với cache.
Cache xác nhận việc ghi ngay lập tức.
Một tiến trình nền sẽ sao chép dữ liệu từ cache vào cơ sở dữ liệu.

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:

Đọc nhanh hơn: Dữ liệu luôn sẵn trong cache, không cần truy vấn cơ sở dữ liệu.
Ghi nhanh hơn: Ứng dụng không cần chờ ghi vào cơ sở dữ liệu, cải thiện thời gian phản hồi.
Giảm tải cơ sở dữ liệu: Các lần ghi được gộp lại, giảm áp lực cho cơ sở dữ liệu.

Nhược điểm:

Rủi ro mất dữ liệu: Nếu cache gặp sự cố trước khi dữ liệu được lưu vào cơ sở dữ liệu, dữ liệu có thể bị mất. Redis có thể giảm rủi ro này với lưu trữ bền vững, nhưng sẽ phức tạp hơn.
Phức tạp: Cần một hệ thống trung gian để đảm bảo cache và cơ sở dữ liệu đồng bộ.
Tốn dung lượng cache: Mọi dữ liệu đều ghi vào cache, kể cả dữ liệu ít được truy cập.



Write-through (Ghi Đồng Thời)

cloudinary

ALT

Cách hoạt động:

Ứng dụng ghi dữ liệu đồng thời vào cả cache và cơ sở dữ liệu.
Để giảm thời gian chờ, có thể ghi vào cache một cách bất đồng bộ.

Ưu điểm:

Đọc nhanh: Tương tự Write-Back, dữ liệu luôn có sẵn trong cache.
Đáng tin cậy: Ứng dụng chỉ xác nhận ghi khi dữ liệu đã được lưu vào cơ sở dữ liệu, đảm bảo không mất dữ liệu nếu xảy ra sự cố ngay sau đó.

Nhược điểm:

Ghi chậm hơn: So với Write-Back, ứng dụng phải đợi ghi vào cả cache và cơ sở dữ liệu, tăng thời gian xử lý.
Tốn dung lượng cache: Dữ liệu không được truy cập thường xuyên vẫn có thể chiếm dung lượng.



Write-around (Ghi Bỏ Qua Cache)

cloudinary

ALT

Cách hoạt động:

Ứng dụng ghi dữ liệu trực tiếp vào cơ sở dữ liệu, không qua cache.
Khi cần đọc, nếu cache không có dữ liệu (cache miss), ứng dụng sẽ lấy từ cơ sở dữ liệu rồi lưu vào cache.

Ưu điểm:

Đáng tin cậy: Dữ liệu luôn được ghi trực tiếp vào cơ sở dữ liệu, đảm bảo tính nhất quán.
Tiết kiệm bộ nhớ cache: Chỉ dữ liệu được truy cập thường xuyên mới được lưu vào cache.

Nhược điểm:

Độ trễ khi đọc cao hơn: Nếu dữ liệu không có trong cache, ứng dụng phải truy vấn cơ sở dữ liệu, gây chậm trễ so với các chiến lược khác.

Cache Miss Pattern

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:

cloudinary

ALT



Cache-Aside

Ứng dụng kiểm tra cache.
Nếu cache miss, ứng dụng sẽ lấy dữ liệu từ cơ sở dữ liệu rồi cập nhật lại vào cache.

Điểm nổi bật:

Ứng dụng kiểm tra cache. Nếu cache miss, ứng dụng sẽ lấy dữ liệu từ cơ sở dữ liệu rồi cập nhật lại vào cache.

Đ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




Read-Through

Ứng dụng gửi yêu cầu mà không cần biết có cache hay không.
Một cơ chế đặc biệt sẽ kiểm tra cache trước, nếu cần thì truy vấn cơ sở dữ liệu, sau đó tự động cập nhật cache.

Ư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

SYDEXA
We learn, we share, we grow together!

About

  • Sydexa

Resources

  • Docs
  • Sydexa Hub

Contact

  • For Work
  • Report

Members

  • Sign in
  • Sign up
  • Portal
@ Sydexa 2024. All copyrights reserved