Cache Caching

Cache và các tầng Cache (Cache-layer) cơ bản

Hello guys,

Trong web development nói chung và backend development nói riêng thì Cache là một trong những yếu tố cũng khá là quan trọng.

Với Cache, các bạn có thể đạt dc các opportunities là:

  • Speed-up application của bạn lên nhiều (thậm chí có thể cực nhiều)
  • Sử dụng lại dc các data đã retrieved cực kỳ nhanh chóng
  • Cung cấp data về cho end-users nhanh nhất có thể

Chúng ta cùng nhau tìm hiểu những cái cơ bản nhất nhé. Để Cache, thì chúng ta phải có plan, có strategy. Không chỉ Cache 1 nơi, mà chúng ta sẽ phải Cache ở nhiều nơi.

Ở đây ngta hay gọi là Cache-Layer và sẽ có N Cache-Layers tùy theo độ lớn của Application của bạn.

Tiến hành thôi

1/ Static Files Caching

Đây là Layer cơ bản nhất của Cache, khi ta serving web cho người dùng. 1 Request diễn ra và họ nhận lại 1 cục HTML, Browser sẽ tiến hành render và load những static files.

Các Static Files bao gồm:

  • HTML (nếu bạn serving HTML thay vì dynamic pages)
  • CSS
  • JS
  • Media files (Image, Video, Music)
  • Và một số file khác (ít sử dụng)

Để cache dc những thứ này, ta sẽ có các giải pháp như sau:

  • Set Headers Caching Time (Cache-Control): Thông qua Headers, bạn có thể set dc thời gian để phía Clients cache lại các Static Files này
    • Pros: client browsers lo hết, đỡ phải quan tâm nhiều
    • Cons:
      • Khi update code mới ở CSS, JS hay đổi files images, videos,… Không có cách nào để clear cache dc bên phía Clients
      • Servers của chúng ta vẫn phải chịu tải khi serving mấy files này (vào lần users access đầu tiên)
  • CDN

Đó là về Layer cơ bản nhất, ta cùng đi tiếp nào

2/ Pre-Application Layer Cache

Đó là bước trước khi mà chúng ta vào Application. Bước này nếu có sẽ boost-up Application của bạn rất nhiều trước khi startup Application của bạn.

Ở bước này thì tùy vào Application của bạn dùng ngôn ngữ, Framework gì. Ví dụ mình xài PHP + Laravel chủ yếu, để pre-application caching, mình có thể:

  • Cache lại Classmap thông qua Composer:
    • composer dump-autoload -o
  • Cache Laravel:
    • Run:
      • php artisan config:cache
      • php artisan view:cache
      • php artisan route:cache
    • Set APP_DEBUG = true

Đại loại vậy, nó sẽ giúp quá trình starting up Application của mình nhanh hơn.

3/ Application/Data Layer Cache

Mình gọi chung là Application hoặc là Data vì cơ bản, xung quanh Application của chúng ta, thứ quan trọng nhất để cache => Chỉ có thể là DATA.

Data từ đâu:

  • Từ Database
  • Từ 1 process nào đó trong code mà generated ra dc

Khi cache ở tầng này, ta phải có plans và strategies nhất định để cache dc.

Điều đầu tiên khi ta nghĩ đến cache lại data, ta sẽ nghĩ đến là:

  • Data này nó ra sao?
  • Data này nó có thay đổi thường xuyên không? Frequently là bao nhiêu? Nó có thực sự thay đổi không?
  • Có nên cache hết lại ko?
  • Có nên cache lại forever ko?

Một số strategies mà ta hay dùng là:

  • Tất cả data này gần như là không thay đổi, access cũng kha khá (hoặc nhiều) => Cache Forever, khi nào thêm/xóa/sửa thì clear rồi cache lại.
    • Ví dụ: Category của đa số các websites.
  • Nếu data thay đổi thường xuyên, cơ mà việc update real time ko quan trọng lắm, lượt access cũng kha khá thì ta có thể cache nhẹ nhàng tầm 15m ~ 30m (hơn tùy thích)
    • Ví dụ: News, Posts, Articles,… của các blog tầm trung, nho nhỏ,…
  • Nếu data thay đổi thường xuyên, cũng ko quan trọng lắm, phụ thuộc vào user (logic kha khá), lúc này ta cũng có thể cache tương tự như trên, nhưng cache specific cho 1 user nhất định.
    • Ví dụ: Posts của Facebook hay Twitter,…
    • Tricks: đôi khi get ra data thì cũng shuffle chút cho user lóe mắt =))
  • Data này cực quan trọng, đa phần là cần realtime real number in DB,… => Ko cache cho an toàn =))
    • Đa phần cái này nó liên quan tới Business Products, họ cần tính đúng đắn khá cao

4/ Conclusions

Tạm thời mình mới suy nghĩ tới đó, để mình nghĩ ra thêm tầng nào nữa thì mình sẽ update thêm nhé =))

Thanks for reading.

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Leave a Reply

Your email address will not be published. Required fields are marked *

Bình luận qua Facebook