Cache trong Laravel 5
Trước khi tìm hiểu về cache trong laravel 5 chúng ta cần phải hiểu cơ chế cache là gì, nó được hiểu như thế nào và ứng dụng của nó ra sao. Định nghĩa Cache được gọi là bộ nhớ đệm và được hiểu là một tâng ở giữa cơ sở dữ liệu và website trong ứng dụng mà bạn xây dựng. Tất cả dữ liệu được lưu trữ ...
Trước khi tìm hiểu về cache trong laravel 5 chúng ta cần phải hiểu cơ chế cache là gì, nó được hiểu như thế nào và ứng dụng của nó ra sao.
Định nghĩa
Cache được gọi là bộ nhớ đệm và được hiểu là một tâng ở giữa cơ sở dữ liệu và website trong ứng dụng mà bạn xây dựng. Tất cả dữ liệu được lưu trữ trong bộ nhớ cache chính là kết quả của những tiến trình xử lý trước đó hoặc là bản copy dữ liệu đã được lưu trữ ở nơi khác (ví dụ trong cơ sở dữ liệu). Để giải quyết bài toán mà các truy vấn tới cơ sở dữ liệu có thể bị chậm khi có nhiều người truy cập vào website cùng lúc thì việc sử dụng cache là giải pháp hoàn toàn hợp lý. Cơ chế cache sẽ hoạt động như là tầng trung gian để lưu trữ những dữ liệu không thay đổi giữa các request và việc lấy các thông tin từ bộ nhớ cache sẽ nhanh hơn rất nhiều hơn là việc bạn phải tính toán lại kết quả hoặc truy vấn lại tới cơ sở dữ liệu.
Cấu hình
Việc cấu hình cache trong Laravel là tương đối đơn giản bởi Laravel cung cấp API thống nhất cho nhiều những hệ thống bộ nhớ cache khác nhau, các cấu hình cho bộ nhớ cache được đặt trong file config/cache.php. Trong file này, chúng ta có thể xác định driver cho bộ nhớ cache được sử dụng mặc định trong ứng dụng. Hiện nay Laravel hỗ trợ các bộ nhớ đệm phổ biến, thông dụng như Memcached và Redis.
Mặc định, Laravel được cấu hình để sử dụng driver bộ nhớ cache file, tức là sẽ lưu trữ tuần tự các đối tượng dựa trên các file theo đường dẫn storage/framework/cache. Đối với các ứng dụng lớn hơn, bạn nên sử dụng một bộ nhớ đệm trong (in-memory cache) như Memcached hoặc APC. Bạn thậm chí có thể config với cùng một driver cho nhiều cấu hình cache cấu hình.
return [ /* |-------------------------------------------------------------------------- | Default Cache Store |-------------------------------------------------------------------------- | | Tùy chọn này thiết lập driver bộ nhớ cache mặc định được sử dụng | Thiếp lập mặc định là ‘file’ tức là sử dụng hệ thống bộ nhớ | cache của tệp tin hệ thống (filesystem). | */ 'default' => env('CACHE_DRIVER', 'file'), /* |-------------------------------------------------------------------------- | Cache Stores |-------------------------------------------------------------------------- | | Mảng "stores" định nghĩa toàn bộ các bộ nhớ cache cũng như | driver của chúng cho ứng dụng của bạn. Bạn có thể định nghĩa | nhiều stores cho cùng một cache driver cho một kiểu group của | các items lưu trữ. */ 'stores' => [ 'apc' => [ 'driver' => 'apc', ], 'array' => [ 'driver' => 'array', ], 'database' => [ 'driver' => 'database', 'table' => 'cache', 'connection' => null, ], 'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache'), ], 'memcached' => [ 'driver' => 'memcached', 'servers' => [ [ 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100, ], ], ], 'redis' => [ 'driver' => 'redis', 'connection' => 'default', ], ], /* |-------------------------------------------------------------------------- | Cache Key Prefix |-------------------------------------------------------------------------- | | Khi triển khai việc lưu trữ trên RAM như APC hoặc Memcached | thì sẽ có khả năng các ứng dụng khác cũng sử dụng cùng một bộ | nhớ cache. Vì vậy, để tránh xung đột ta thiết lập một giá trị | tiền tố (prefix) cho tất cả các từ khóa (key) lưu trữ. */ 'prefix' => 'laravel', ];
Các thiết lập bắt buộc
- Database
Sử dụng driver cache là database thì việc bắt buộc bạn cần phải create trong database một bảng để chứa các đối tượng cần lưu trữ. Cách tạo bảng như sau:
php artisan make:migration --create="caches" create_caches_table Created Migration: 2016_02_24_072808_create_caches_table
file database/migrations/2016_02_24_072808_create_caches_table.php được sinh ra, chúng ta chỉnh sửa trong function up như sau:
public function up() { Schema::create('caches', function (Blueprint $table) { $table->increments('id'); $table->string('key')->unique(); $table->text('value'); $table->integer('expiration'); $table->timestamps(); }); }
- Memcached
Nếu các bạn cài đặt Memcached làm driver chính thì Laravel yêu cầu bạn phải cài đặt Memcached PECL package.
- Redis
Khi đặt cache Redis với Laravel thì điều tiên quyết bạn cần phải cài đặt thông qua composer thông qua lệnh composer require predis/predis. Tham khảo cấu hình Redis
Cách sử dụng bộ nhớ cache trong Laravel
- Tạo đối tượng bộ nhớ cache
Laravel cung cấp tiện ích contract (tập hợp các interface thiết lập các dịch vụ) IlluminateContractsCacheFactory và IlluminateContractsCacheRepository để truy cập vào các dịch vụ bộ nhớ cache của Laravel. Contract Factory cho phép bạn truy cập tới tất cả các driver bộ nhớ cache cho ứng dụng của bạn được xác định trong file cấu hình cache của bạn. Tuy nhiên bạn nên sử dụng facade (cách để Laravel sử dụng các chức năng được cung cấp từ các class được sử dụng thông qua các service provider) cache để có thể truy cập thuận tiện và dễ dàng hơn tới các contract bộ nhớ cache được Laravel sử dụng.
Ví dụ cách import facade cache vào trong controller:
<?php namespace AppHttpControllers; use Cache; class UserController extends Controller { /** * Show a list of all users of the application. * * @return Response */ public function index() { $value = Cache::get('key'); } }
- Lấy dữ liệu trong bộ nhớ cache
Sử dụng phương thức get để lấy dữ liệu từ bộ nhớ cache trong facade cache trong laravel 5. Giấ trị null sẽ được trả về nếu dữ liệu get ra mà không có trong bộ nhớ cache. Để tránh tình trạng trả về null mà không kiểm soát được, bạn có thể truyền giá trị default vào cho phương thức get.
$value = Cache::get('key'); // truyền giá trị default $value = Cache::get('key','default');
Một ví dụ đơn giản khác, nếu muốn lấy toàn bộ thông tin user từ bộ nhớ cache, nhưng nếu trong cache không tồn tại dữ liệu thì bạn sẽ lấy thông tin user từ database và thêm nó vào bộ nhớ cache. Sử dụng phương thức Cache::remember để làm được điều này:
$minutes = 30;//Thời gian hết hạn $value = Cache::remember('users',$minutes,function(){ return DB::table('users')->get(); });
Trong trường hợp khác, khi bạn muốn lấy dữ liệu từ bộ nhớ cache sau đó không cần dùng nữa thì bạn có thể dùng phương thức pull. Phương thức này cũng trả về null khi dữ liệu không tồn tại trong cache.
$value = Cache::pull('key');
- Kiểm tra sự tồn tại dữ liệu cache
Laravel cung cấp cho bạn phương thức has để kiểm tra sự tồn tại của dữ liệu trong cache
if(Cache::has('key')) { // Code nếu có giá trị trong bộ nhớ cache }
- Tăng và giảm các giá trị
Các giá trị thuộc kiểu integer trong cache khi lấy ra được thì có thể tăng hoặc giảm giá trị của chúng thông qua các phương thức increment và decrement, giá trị mặc định tăng hoặc giảm là 1, tuy nhiên cũng có tùy chọn giúp bạn tăng những giá trị của tham số tương ứng truyền vào các phương thức
$amount = 10; //Số giá trị muốn tăng / giảm Cache::increment('key'); Cache::increment('key',$amount); Cache::decrement('key'); Cache::decrement('key',$amount);
- Lưu trữ vào cache
Facade của Laravel cung cấp một số hàm có tác dụng lưu trữ dữ liệu vào trong cache. Xét ví dụ sau ta có thể hiểu hơn về nó:
$minutes = 60;//Thời gian hết hạn // Lưu trữ dữ liệu với hiệu lực một khoảng thời gian là $minutes Cache::put('key','value',$minutes); /* Có thể sử dụng những đơn vị thời gian khác nhau như ngày, tuần, tháng, ... */ $expiresAt = Carbon::now()->addDays(7); //Đặt thời gian hết hạn sau 1 tuần Cache::put('key','value',$expiresAt); // Phương thức add trả về true nếu thành công và false nếu ngược lại Cache::add('key','value',$minutes); // Lưu một giá trị vĩnh viễn trong cache Cache::forever('key','value');
- Xóa dữ liệu trong cache
Laravel cũng cấp lệnh xóa một dữ liệu có key tương úng hoặc xóa toàn bộ dữ liệu trong cache ta làm như sau:
// xóa một giá trị Cache::forget('key'); // Xóa toàn bộ dữ liệu trong cache Cache::flush();