Hi all,
Nay mình sẽ qua bàn luận về cache cũng như chia sẻ 1 số layers để cache hiệu quả nhé.
Như các bạn đã biết, khi code đến 1 thời điểm nào đó, để application chạy nhanh hơn nữa thì kiểu gì cũng fải bắt tay với cache.
Chúng ta từ từ đi lần lượt vào nhóe 😀
1/ Basic về Cache
Vỡ lòng thì chúng ta sẽ hay có những đoạn cache-code basic như sau:
<?php
// Demo: ArticleService.php
// Get article to do something
$article = Article::find($id);
[...]
// store article and use it another part of the lifecycle.
ArticleInstance::$instance[$id] = $article;
[...]
// cache class
class ArticleInstance {
/**
* @var Article $instance
*/
public static $instance;
}
Và ở 1 chỗ nào đó, ta gọi ra để sử dụng lại + đỡ fải query lại 1 lần nữa lên database => Đó là một trong những cache basic nhất, cũng như bạn khai báo 1 biến rồi re-use lại.
// retrieve current handling article
$currentArticle = ArticleInstance::$instance;
Đó chính là những cái basic nhất về Cache, đơn giản bạn có thể hiểu là: Sử dụng lại dữ liệu mà retrieve một cách nhanh nhất có thể
2/ Cache Storage và các thể loại của nó
Tất nhiên, muốn Cache lại dữ liệu thì bạn fải có Storage nhất định để lưu lại nó, cụ thể ta có:
- File System: lưu ở dạng file trên ổ cứng.
- Tốc độ: Khá nhanh, SSD thì còn nhanh hơn nữa
- Độ hiệu quả: Tốt, dành cho những SaaS hay Website có cả lượng truy cập vài trịu, cơ mà vài chục vài trăm trịu có khi nó bị nghẽn
- Tiền: tốn ít =)), hiện nay các provider Server or VPS thì toàn SSD thui, tốc độ min là 500MB/s nhóe. Server mà trang bị SSD xịn thì còn dc la liếm up to 1200MB/s
- Ram:
- Tốc độ: cực nhanh, filesystem fải xách dép cho
- Độ hiệu quả: Cao, tuy nhiên phải có architecture hợp lý ko sẽ broke down toàn bộ application.
- Tiền: khá tốn :v, giá Ram hiện tại vẫn khá cao kể cả đi mua hay đi thuê Server.
- Tool phổ biến: Redis (HOTTEST), Memcached
- Database:
- Khi đã nghĩ tới cache, ít ai lại cache lại trên database lại cả. Trừ 1 số specific case hoặc avoid 3rd party components.
- Ví dụ như Magento, cơ chế hoạt động rất dynamic để phù hợp với nhu cầu e-commerce => Nên database nó rất phắc tạp. Vì vậy nó sẽ luôn tạo ra 1 table cache để store lại toàn bộ products và các attributes,…
3/ Laravel Cache Facade
Laravel Cache Facade là một Library dc build native sẵn trong Laravel framework hỗ trợ bạn cache lại data cũng như access cache data dễ dàng hơn.
Cache Facade hoạt động theo cơ chế Key – Value (HashMap/Associative Array) để dễ dàng lưu và truy xuất (O(1)) (Bản thân Redis cũng vại, hoạt động theo Key Value)
Cache Facade hỗ trợ các storage:
- FileSystem – Default Configuration
- Redis – Cần phải cài 1 trong 2 libraries như sau (mình thì ưu tiên PhpRedis hơn):
- PhpRedis – PHP C Extension
- Composer install predis/predis
- Memcached
- Database
- Xài thèn nì các bạn lưu ý vào documentation của Laravel để run cái Schema nhóe. Nó ko tạo sẵn như queue:table đâu
Mọi thông tin chi tiết về các basic functions & advance usage có mặt lại URL này: https://laravel.com/docs/6.x/cache
Lưu ý: Nếu sử dụng cache storage là filesystem, phải chắn chắn là thư mục storage của bạn dc có đầy đủ quyền (Linux nhaaa), ko thì ăn 1 cái Exception nha =))
3.1/ Sử dụng Cache Facade một cách cực kỳ Basic
Lấy data từ Cache:
// Get Cache by Key
Cache::get('Seth'); // Phat
Save data vào Cache:
// Save Data to Cache
// First argument: cache key
// Second argument: value/data
// Last argument: time till cache being deleted
Cache::put('Seth', 'Phat', 300); // 5 minutes
Gộp lại bằng function khác clean hơn xíu đỡ fải Cache::has => Cache::get như nguyên thủy, ta dùng remember:
// Get or Get & Set
$registeredUsers = Cache::remember('seth_phat_blog_users', $seconds, function () {
return User::select('email', 'id')->get();
});
Basically là vại, còn nhìu cái nữa mà mình chưa dùng tới =))
3.2/ Cache Object/Instance
Vâng, theo cách trên các bạn chỉ Cache dc hết nhé, kể cả Object của bạn
- Primitive Data Types (Int, String, Float, Boolean)
- Array
- NULL
- Specific Object
Đã test trên:
- stdClass
- Normal Class (get data set data, private/protected properties,…)
- Eloquent
Về object thì Laravel có cơ chế Serialize/Deserialize của nó và yên tâm khi ta get lên là chỉ sử dụng típ thoy <3
Chưa test về việc Cache lại 1 Query Builder của Eloquent/Laravel nhưng mình tin tưởng là nó vẫn hoạt động tốt <3
3.3/ Cache Eloquent
Về Cache Object/Eloquent ở trên, nó chỉ cache ở mức độ basic nhất là data hiện tại của object.
Về Cache sâu và rộng hơn trong Eloquent, các bạn có thể tham khảo library này: https://github.com/GeneaLabs/laravel-model-caching
4/ Cache Static HTML
Về phần này thì nó thuộc phạm trù presentation layer, ko còn trong backend/process layer nữa.
Ví dụ như 1 blog post – article – bài viết hoặc 1 thông tin nào đó. Những page mà ít bị thay đổi dữ liệu, ko cần thiết phải dynamically rendering => Chúng ta sẽ sử dụng cách này để serving cho người dùng, advantages là:
- Truy cập cực nhanh vì đã có sẵn trong filesystem, chỉ lấy ra serving ng` dùng thoy.
- Tránh việc dynamically rendering liên tục, đỡ tốn tài nguyên
- CDN có thể cache dc ngon lành và serving worldwide
- …
Tất nhiên là nó cũng có những mặt hại của nó, tuy nhiên hại hay ko thì phải xem vềnhu cầu của mình nữa.
Để Render ra View + Cache lại dưới HTML và serving HTML, các bạn có thể tham khảo Library này: https://github.com/JosephSilber/page-cache
5/ Kết luận
Khi bạn đã nghĩ tới việc cache, chứng tỏ là level bạn đang lên dần. Tuy nhiên chúng ta cũng phải biết cache đúng nơi gãi đúng chỗ ngứa thì application của chúng ta sẽ nhanh lên rất là nhiều.
Cám ơn các bạn đã theo dõi – còn thì mình sẽ update típ =))