+3

Tìm hiểu Caching trong Laravel 5

Chào các bạn, Hôm nay chúng ta cùng nhau tìm hiểu caching trong laravel 5 nhé!! I/ Hướng dẫn cấu hình Cache trong Laravel 5.x

  • Trong laravel muốn config cache để caching data thì chúng ta thao tác với file config/cache.php. Khi mở file này chúng ta thấy ngay tại khóa store sẽ có các driver cho chúng ta lựa chọn:
'stores' => [
        'apc' => [ ... ],
        'array' => [ ... ],
        'database' => [ ... ],
        'file' => [ ... ],
        'memcached' => [ ... ],
        'redis' => [ ... ],
    ]

Để đảm bảo Driver luôn đúng thì bạn có thể set giá trị cho Driver của Caching trong biến môi trường .env. Set như sau

CACHE_DRIVER=file

II/ Tìm hiểu Cache Facade trong Laravel

  • Khi làm việc với cache hầu hết chúng ta thao tác với Cache Facade. Vậy Cache Facade có những gì
  • trong đó ??
  • Cache Facade chưa nhiều static method, chẳng hạn: create, update, delete, get và kiểm tra sự tồn tại của cache (hay chính xác hơn là dữ liệu đã caching). Để các bạn hiểu hơn về các method này thì chúng ta cùng tìm hiểu nhé 😃
  1. Create và Update giá trị cache
  • Để add/update một giá trị cần caching thì chúng ta sử dụng method put. Method này cần có 3 đối số:
  • Đối số thứ nhất: key
  • Đối số thứ 2: value
  • Đối số thứ 3: expiration time, tính bằng phút
  • Lưu ý: key là định danh mang tính chất unique. Nên lưu ý không đặt trùng key khi caching Ví dụ:
Cache::put('key', 'value', 10);

Mở rộng hơn, chúng ta có thể sử dụng method remember để tự động lấy và cập nhật giá caching. Đầu tiên, method này sẽ check key, nếu key đã được lưu thì sẽ lấy giá trị của key này. Nếu key chưa có thì tạo key với giá trị được định nghĩa trong closure function. Ví dụ:

Cache::remember('articles', 15, function() {
    return Article::all();
});
  1. Lấy giá trị cache
  • Để lấy được giá caching, thì chúng ta sử dụng method get. Method cần một đối số là key (Key đã được set ở phần 1)
  • Ví dụ:
Cache::get('key');
  1. Kiểm tra sự tồn tại của caching
  • Đôi khi chúng ta cần kiểm tra sự tồn tại của cache trước khi update hay là get giá trị caching để tránh bị lỗi. Vậy method nào giúp chúng ta làm việc này?
  • Đó là method has(). Ví dụ:
if (Cache::has('key')){
    Cache::get('key');
} else {
    Cache::put('key', $values, 10);
}
  1. Remove giá trị cache
  • Để remove giá trị cache thì chúng ta sử dụng method forget(). Ví dụ:
Cache::forget('key');

Ngoài ra chúng ta cũng có thể xóa cache bằng cách sử dụng console. Lệnh như sau:

php artisan cache:clear

III/ Ví dụ thực tế Ví dụ sau đây sẽ so sánh request khi có cache và không cache. Mời các bạn theo dõi để hiểu thêm nhé 😃 1/ Tạo Model và Migrations

  • Tạo model artcticles
php artisan make:model Article -m
  • Vào file migrations vừa tạo ở trên thêm 2 field như sau vào
public function up() {
    Schema::create('articles', function (Blueprint $table) {
        $table->increments('id');

        // add the following
        $table->string("title");
        $table->string("content");

        $table->timestamps();
    });
}
  • Migration database
php artisan migrate

2/ Seed data cho database

  • Để cho nhanh gọn, các bạn vào file database/seeds/DatabaseSeeder.php. Tại method run() các bạn thêm vào đoạn code như sau:
public function run() {
    Model::unguard();

    // use the faker library to mock some data
    $faker = Faker::create();

    // create 30 articles
    foreach(range(1, 30) as $index) {
        Article::create([
            'title' => $faker->sentence(5),
            'content' => $faker->paragraph(6)
        ]);
    }

    Model::reguard();
}
  • Tiếp theo chạy lệnh sau để seed data
php artisan db:seed

3/ Tạo controller Article

  • Chạy lệnh sau để tiến hành tạo controller
php artisan make:controller ArticlesController
  • Tiếp theo chúng ta vào file app/Http/routes.php để định nghĩa một Endpoint cho Controller này
Route::group(['prefix' => 'api'], function() {
    Route::get('articles', 'ArticlesController@index');
});

Tới đây thì chúng ta đã sẵn sàng để test đúng không nào 😄. Ok, test thôi

4/ Test Request khi không cache

  • Trong trường hợp này chúng ta không caching lại request và hãy thử xem khi không caching thì tốn bao lâu để response lại 1 request 😃
public function index() {
    $articles = Articles::all();
    return response()->json($articles);
}
  • Để thấy được time process một request thì có thể dùng postman để test. Mình test và thấy kết quả sau

5/ Test Response khi có cache

 public function index() {
    $articles = Cache::remember('articles', 22*60, function() {
        return Article::all();
    });
    return response()->json($articles);
}
  • Kết quả chạy postman => Thông qua ví dụ nhỏ ở trên thì các bạn đã hiểu phần nào về vai trò của caching đúng không nào. Sau đây mình sẽ so sánh khi dùng một số dạng cache cho các bạn thấy 😃

IV/ Recommend 1/ Không dùng cache

2/ Dùng cache - File Driver

3/ Dùng cache - Memcache

4/ Dùng cache - Redis

  • Lưu ý: Để dùng được Redis thì bạn phải cài package predis/predis thông qua composer

Thông qua các ví dụ, ứng dụng thực tế và bảng so sánh khi dùng các Driver cache thì chúng ta đã rút ra cho mình được những bài học về caching đúng không nào. Đến đây mình xin chào các bạn nha, cảm ơn các bạn đã đọc bài viết của mình 😃 😃


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í