0

Đôi điều về Cache

Caching là một kỹ thuật được sử dụng để tăng tốc độ load page, cũng như là giảm thiểu load các tài nguyên trên servers hoặc là trong databases. Đặc biệt là trong việc giảm tải hoặc tăng tốc truy vấn CSDL thì cache là một phương án có thể nghĩ đến. Ngoài ra thì kỹ thuật caching còn giúp bảo vệ hệ thống, tránh được các rủi ro khi lượng truy vấn CSDL tăng đột biến.

1. Client caching

Đây là một trong những kĩ thuật cache cơ bản cũng như là rất dễ để thực hiện, caches có thể được lưu ở phía cliens (OS hoặc trình duyệt), cũng có khi nó nằm ở phía server, thậm chí nằm ở trong các tầng cache khác nhau tùy thuộc vào cấu trúc của project cũng như là mục đích sử dụng cache của developers.

2. CDN caching

CDNs (Content delivery network) đây cũng là một dạng cache khá phổ biến. Nói qua một chút về CDNs thì CDNs là một hệ thống server proxy phân tán, điều đặc biệt ở đây là phạm vi của nó không bị giới hạn trong một quốc gia, hay một vùng lãnh thổ mà nó là toàn cầu (globally).

Thông thường các static files như là HTML/CSS/JS, hỉnh ảnh, videos, âm thanh sẽ được lấy từ CDNs, ngoài ra một số CDNs đặc biệt như Amazon's CloudFront còn support cả việc dynamic contents

3. Web server caching

Ở kỹ thuật caching này thì Reverse proxies và caches được phối hợp với nhau. Điều này giúp cho việc xử lí static và dynamic content được trở nên thông suốt và dễ dàng hơn. Web servers cũng có thể được dùng để cache lại request và sau đó return respones lại ngay cho người dùng, việc này cũng giúp giảm được xử lí đến tầng application servers

4. Database caching

Thông thường thì CSDL đã được config caching sẵn trong cấu hình mặc định, và nó đã được tối ưu hóa cho việc xử lí các use case mà chúng ta thường gặp. Nếu muốn tăng thêm hiệu suất, bạn đọc có thể chỉnh sửa sao cho phù hợp với như cầu sử dụng của mình

5. Application caching

Đây cũng là một trong những kỹ thuật caching khá phổ biến, kỹ thuật này sử dụng việc lưu trữ dữ liệu của application vào một data storage thay vì lưu ở trên phần cứng (những dữ liệu lưu trên data storage này là những dữ liệu ít khi bị thay đổi hoặc là bất biến theo thời gian). Lúc này dữ liệu sẽ được lưu giữ lại trên RAM, điều này giúp cho việc truy xuất sẽ nhanh hơn so với khi lưu giữ dữ liệu trên các thiết bị phần cứng máy tính.

Tuy nhiên vấn đề phát sinh đó chính là RAM thì sẽ có dung lượng giới hạn bộ nhớ, tuy nhiên bạn đọc cũng không phải lo lắng quá vì một số các thuật toán cache invalidation như least recently used (LRU) có thể giúp giải quyết được vấn đề này.

Cuối cùng có rất nhiều level cache mà bạn đọc có thể áp dụng kỹ thuật này, nhưng tựu chung lại thì sẽ có hai loại chính đó là database queries và objects. Ngoài ra còn có thêm các level khác nữa chẳng hạn:

  • Row level
  • Query-level
  • Fully-formed serializable objects
  • Fully-rendered HTML

Một lưu ý nho nhỏ nữa là tránh việc caching file (file-based caching) vì nó sẽ khó cho việc mở rộng và auto-scaling sau này.

6. Caching at the database query level

Ở kỹ thuật caching này, khi truy vấn CSDL thì sẽ có một function hash câu truy vấn ra thành key, tức là lúc này ta sẽ có key là hash của câu query, value là kết quả có được sau khi thực hiện câu truy vấn và cặp key-value này sẽ được lưu lại trong cache

7. Caching at the object level

Tư tưởng của kỹ thuật caching này là chuyển đổi data cần cache lại thành các object sau đó thì sẽ lưu nhưng object này vào cache store, khi áp dụng kỹ thuật này bạn đọc nên có một vài lưu ý:

  • Hủy bỏ các object từ bộ nhớ cache, nếu dữ liệu cơ bản của nó đã thay đổi
  • Cho phép xử lí asynchronous luôn cập nhập update object được lưu trong bộ nhớ cache sang state mới nhất

Một vài thứ bạn có thể cache ở kỹ thuật này:

  • User sessions
  • Fully rendered web pages
  • Activity streams
  • User graph data

8. Khi nào thì cần cập nhập lại data có trong cache

Vì chỉ có thể lưu trữ một lượng dữ liệu giới hạn trong bộ nhớ cache, vì thế sẽ cần cập nhật, lưu trữ bộ nhớ cache nào phù hợp nhất cho trường hợp sử dụng của mình. Việc cập nhập lại data có trong cache là điều cực kì quan trọng, nó giúp có dữ liệu của chúng ta đảm bảo được tính nhất quán, xuyên suốt, tin cậy trong vòng đời của sản phẩm. Tránh được các dị thường khi làm việc, dưới đây là một vài phương pháp áp dụng cập nhập dữ liệu có trong cache.

  • Cache-aside

Application sẽ chịu trách nhiệm cho việc reading và writing từ storage, cũng như là cập nhập dữ liệu cho Cache, như ở hình vẽ phía trên thì CACHE không tương tác trực tiếp với storage tất cả các thay đổi trong CACHE đều được thực hiện qua application. Lúc này luồng xử lí sẽ như sau:

Step 1: Tìm kiếm đối tượng trong bộ nhớ cache

  • nếu đối tượng là None goto Step 2
  • nếu đối tượng là not None goto Step 4

Step 2: Load object từ CSDL

Step 3: Thêm object vừa tìm được vào cache

Step 4: Return object

def get_user(self, user_id):
    user = cache.get("user.{0}", user_id)
    if not user:
        user = db.query("SELECT * FROM users WHERE user_id = {0}", user_id)
        if user:
            key = f"user.{user_id}"
            cache.set(key, json.dumps(user))
    return user

Hạn chế của cache-aside:

Dữ liệu trong cache có thể trở cũ nếu có sự thay đổi trong cơ sở dữ liệu. Để khắc phục điều này cache cần được set một khoảng thời gian tồn tại time-to-live (TTL) để khi hết thời gian thì dữ liệu trong cache sẽ được cập nhập lại hoặc bằng cách sử dụng phương pháp write-through

  • Write-through

Như hình vẽ phía bên trên thì cache sẽ đững giữa tầng application và tầng users. Tầng application sẽ đọc và ghi dữ liệu với cache, sau khi cache có dữ liệu rồi thì sẽ chịu trách nhiệm đọc và ghi dữ liệu với database, ở phương pháp write-through cache sẽ chủ động cập nhập dữ liệu có bên trong. Lúc này luồng xử lí sẽ như sau:

Step 1: Application adds/updates object vào trong cache

Step 2: Cache synchronously writes object vào data store

Step 3: Return

Application code

set_user(12345, {"name":"litchi"})

Cache code

def set_user(user_id, values):
    user = db.query("UPDATE Users WHERE id = {0}", user_id, values)
    cache.set(user_id, user)
    return

Write-through có tốc độ chậm do hoạt động ghi xảy ra ở 2 nơi trước khi được return về cho người dùng. Người dùng thường chịu được độ trễ khi cập nhật dữ liệu hơn là đọc dữ liệu. Tuy nhiên thì nó khác phục được điểm yếu của cache-aside đó là data trong cache thì không bị cũ.

(còn tiếp)


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí