laravel eloquent observer

Laravel – Awesome Cache Tutorials

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 =))

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