Bạn biết gì về Caching – Kĩ thuật được 96.69% hệ thống sử dụng để tăng tốc độ tải

Gần đây, nhiều bạn yêu cầu Code Dạo viết thêm mấy bài nặng tính kĩ thuật về architecture design hơn. Do vậy, Code Dạo sẽ chia sẻ thêm về những kĩ thuật design, các system component phổ biến mà các hệ thống lớn hay dùng nhé!

Trong bài này, chúng ta sẽ tìm hiểu về Caching, một kĩ thuật được sử dụng trong 96,69% các hệ thống để tăng tốc độ tải và giảm tải cho hệ thống nhé.

Đây là một kĩ thuật rất đơn giản nhưng lại vô cùng hiệu quả và cực kì phổ biến!

Caching là gì? Quan hệ giữa Caching và … ổ bánh mì

Theo Wikipedia, cache là nơi chứa dữ liệu, nhằm giúp tăng tốc độ truy xuất dữ liệu ở những lần sau.

Hãy tưởng tượng như thế này! Bạn đang nằm nhà và thèm ăn bánh mì (bánh mì ở đây là dữ liệu cần xử lý). Bạn có 2 lựa chọn:

  1. Chạy ra tiệm mua bánh mì về ăn (tương đương với gọi request tới remote service như database, web service, xa nên mất thời gian).
  2. Lăn vào bếp nướng bánh mì (tương đương với tính toán xử lý nhiều, tốn CPU).

Giả sử ngày nào bạn cũng ăn 3 ổ bánh mì, mỗi lần đi xa mua về hoặc nướng bánh mì sẽ rất mất thời gian. Lúc này, bạn mua một cái tủ lạnh (tủ lạnh đựng bánh mì, cũng giống như cache chứa dữ liệu). Sau đó, bạn chỉ cần:

  1. Mua hoặc nướng 30 ổ bánh mì, bỏ vào tủ lạnh (tương đương với lưu data vào cache).
  2. Khi cần, bạn chỉ việc mở tủ lạnh ra lấy bánh mì ăn (lấy data từ cache)
  3. Lấy bánh mì từ tủ lạnh vừa gần lại không tốn CPU (Bạn chỉ cần đi từ phòng ra tủ lạnh, không cần nấu nướng chế biến gì).

Trong trường hợp này, ổ bánh mì chính là dữ liệu, tủ lạnh chính là cache. Hành động bỏ bánh mì vô tủ lạnh, lấy bánh mì ra chính là caching; nhằm tiết kiệm thời gian đi mua bánh, tiết kiệm công sức làm ra bánh mì.

Tủ bánh mì là cache chứa rất nhiều dữ liệu… đói bụng quá 😦

Nói cho đơn giản, caching là cách ta hi sinh memory/disk (tốn tủ lạnh) để giảm CPU time, hoặc network time nhằm tăng tốc độ hoặc giảm tải hệ thống.

Đến đây các bạn đã thấy dễ hiểu chưa nào?

Ưu điểm của Caching

Lý do mà caching vô cùng phổ biến trong nhiều hệ thống là bởi vì nó có quá trời ưu điểm:

1. Vô cùng hiệu quả

Caching giải quyết được hầu hết mọi vấn đề về performance + bottleneck.

Giả sử mỗi giây bạn nhận được 100 request, mỗi request sẽ mất 1s để chờ database query xử lý. Database sẽ dễ bị quá tải, người dùng thì chờ mòn râu.

Sử dụng caching để cache kết quả query vào RAM, lúc này thời gian tuy xuất chỉ còn tầm 50-100ms, lại không phải cần truy cập database. Hệ thống được giảm tải, còn người dùng lại nhận được kết quả nhanh hơn rất nhiều nhiều.

Đọc dữ liệu từ Cache thay vì Database
2. Đơn giản dễ hiểu, dễ implement

Kể cả khi không dùng thư viện, chỉ cần dùng HashMap dạng Key-Value là bạn đã có thể implement caching một cách đơn giản rồi.

Trong các hệ thống cũng vậy, khi thấy một hàm chạy lâu, tốn nhiều tài nguyên, đôi khi chỉ cần implement caching cho hàm đó là hệ thống đã chạy nhanh ngay, không ảnh hưởng đến các thành phần khác của hệ thống.

3. Support tận răng

Do phổ biến nên hầu như các ngôn ngữ đều có những thư viện hỗ trợ caching cả.

Trong các hệ thống lớn, người ta có những cache server riêng như Redis, Memcache. Các server cache này có performance vô cùng mạnh mẽ, hỗ trợ backup v…v nên rất dễ tích hợp vào hệ thống.

Redis và Memcache là 2 lựa chọn phổ biến cho cache server

Những điều cần lưu khi sử dụng Caching

Tuy vậy, khi hệ thống trở nên phức tạp, caching không hợp lý có thể dẫn đến những hậu quả vô cùng nguy hại.

1. Stale Data – Stale Cache

Quay lại chuyện cái bánh mì lúc đầu nhé!

Giả sử hạn sử dụng của ổ bánh mì trong tủ lạnh là 3 ngày. Bạn lỡ đi công tác một tuần, lúc về đói quá, mở bánh mì trong tủ lạnh ăn. Nửa tiếng sau, bạn mặt xanh mét chui vào toilet tâm sự cùng Tào Tháo vì dính sán khuẩn salmonmandella.

Đây là bạn sau khi ăn ổ bánh mì trong cache

Dữ liệu trong cache cũng vậy, nếu không được update thường xuyên sẽ bị stale.

Giả sử người dùng đăng comment trong 1 bài viết, khi refresh lại trang, ta hiển thị dữ liệu trong cache trước khi có comment. Người dùng sẽ cảm thấy … bối rối và tưởng hệ thống bị lỗi.

2. Cache Invalidation

Để tránh tình trạng trên, ta phải invalidate cache.

Tức là, khi dữ liệu thay đổi, ta phải xóa dữ liệu trong cách, tính toán dữ liệu mới (Giống như đi mua hoặc làm bánh mì mới, quăng bánh mì cũ vào thùng rác ấy).

Việc này không hề dễ dàng chút nào. Có một câu nói nổi tiếng thế này:

Có 2 vấn đề khó khăn trong ngành Khoa Học Máy Tính: Cache invalidation và đặt tên các thứ

Nếu để cache quá lâu thì dữ liệu sẽ bị stale, nếu refresh quá thường xuyên thì cache trở nên … vô dụng (vì tự tính luôn cho rồi).

Ngoài ra, ta còn phải hiểu sẽ business logic hoặc logic của chương trình mới biết được nên cache những gì, cache mất bao lâu nữa!

Caching trong các hệ thống thực tế

Trong thực tế, caching được sử dụng ở rất nhiều tầng. Thường developer chúng ta sẽ quan tâm caching ở tầm application (vì chúng ta code ở phần này):

  • Trong CPU có caching để tăng tốc độ xử lý. (Vì vậy mới có vụ lỗi bảo mật Meltdown)
  • SQL Server cũng có caching để lưu query plan
  • Giao thức HTTP hỗ trợ trình duyệt cache các tài nguyên từ server, thông qua header Cache-Control. Nhờ header này mà web thegioididong load nhanh, đỡ phải tải lại resource.
  • Trong lập trình, các kĩ thuật như memoization, dynamic programming cũng sử dụng cache để tăng tốc độ xử lý.
  • Trong các ứng dụng đơn giản, ta thường sử dụng các thư viện cache để lưu dữ liệu vào memory của server.
  • Trong các ứng dụng lớn, có nhiều application server, người ta thường lưu trữ cache trong một server riêng, sử dụng Memcache hoặc Redis
  • Bản thân CDN – Content Delivery Network cũng là một dạng cache, đưa static resource như ảnh, CSS, JS đến server nằm gần người dùng hơn (nhằm tăng tốc độ tải).
CDN cũng là một dạng cache

Tạm kết

Nói túm lại, Caching là một kĩ thuật giúp tăng tốc độ xử lý. Kĩ thuật này đơn giản, dễ implement mà lại vô cùng hiệu quả nên được sử dụng trong rất nhiều hệ thống.

Nếu bạn muốn tăng tốc hệ thống hoặc giảm tải server, hãy thử tìm những hàm chậm và nặng, thử áp dụng caching cho chúng nhé. Có thể bạn sẽ cảm thấy điều khác biệT ngay đấy.

Đây là một trong những bài viết đầu tiên của Code Dạo về System Design và Architecture Design. Nếu thấy hay, các bạn nhớ comment ủng hộ hoặc like share nhé! Nếu có nhiều người quan tâm thì mình sẽ viết về chủ đề này nhiều hơn.

 

P/S: Để theo dõi bài viết trên Tôi Đi Code Dạo, nhớ Subscribe Chat Bot của tụi mình nha. Bot của Code Dạo sẽ gửi bạn những bài viết cực kì hay ho về kĩ năng mềm và cứng, kinh nghiệm trong ngành vào thứ 4 hàng tuần nhé!

Đăng ký bài viết

12 thoughts on “Bạn biết gì về Caching – Kĩ thuật được 96.69% hệ thống sử dụng để tăng tốc độ tải”

      1. Vậy làm sao thay đổi session của người dùng khi có sự thay đổi ở phía admin anh.
        Ví dụ người dùng có 1 danh sách nào đó (danh mục sản phẩm) lưu vào session
        Em vào trang quản trị để sửa lại danh sách đó, thì làm sao để đồng bộ phía người dùng ạ

        Like

  1. Hôm nay em học về nguyên lý hệ điều hành, tới phần caching này nên tìm lại lên đây. hay quá anh :v

    Like

Leave a comment