Cơ bản về Laravel Cache
Đối với những dự án có lượng người dùng truy cập cao hoặc có số lượng bản ghi dữ liệu lớn, thì một tác vụ truy xuất hoặc xử lý dữ liệu có thể mất vài giây để hoàn thành, và CPU sẽ phải hoạt động rất nhiều để xử lý các truy vấn từ người dùng. Trong những trường hợp này, để tối ưu hiệu suất xử lý cũng như thời gian truy cập, thông thường dữ liệu đã truy xuất sẽ được lưu vào bộ nhớ cache trong một khoảng thời gian nhất định để có thể truy xuất nhanh hơn trong các yêu cầu tiếp theo đối với cùng một dữ liệu. Bộ nhớ cache có thể là Memcached hoặc Redis.
Trong Laravel đã cung cấp một API để các bạn có thể làm việc với các hệ thống cache phía backend phổ biến hiện nay, cho phép bạn tận dụng khả năng truy xuất dữ liệu rất nhanh của chúng và cải thiện tốc độ ứng dụng web của bạn.
1. Cấu hình
Để cấu hình các thông số liên quan đến cache trong Laravel, các bạn có thể chỉnh sửa trong file config/cache.php
. Trong file này bạn có thể chỉ định cache driver nào bạn muốn sử dụng mặc định trong ứng dụng. Laravel hỗ trợ sẵn các hệ thông cache phía backends phổ biến như Memcached và Redis.
Mặc định Laravel sẽ sử dụng cache driver là file, khi sử dụng driver này thì các cache data sẽ được lưu trữ vào các file và mặc định chúng sẽ được lưu trữ vào trong thư mục storage/framework/cache/data
. Đối với các ứng dụng lớn thì bạn nên sử dụng những driver chuyên dụng hơn như Memcached hoặc Redis.
2. Thiết lập Driver
- Database
Khi sử dụng cache driverdatabase
để lưu cache, bạn sẽ cần tạo một bảng để lưu trữ các cache items:
Schema::create('cache', function ($table) {
$table->string('key')->unique();
$table->text('value');
$table->integer('expiration');
});
hoặc có thể dùng câu lệnh php artisan cache:table
để tạo migration.
- Memcached
Để sử dụng Memcached thì bạn cần cài đặt Memcached PECL package. Sau đó bạn có thể liệt kê các server Memcached của mình trong fileconfig/cache.php
với keymemcached
:
'memcached' => [
'driver' => 'memcached',
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
'sasl' => [
env('MEMCACHED_USERNAME'),
env('MEMCACHED_PASSWORD'),
],
'options' => [
// Memcached::OPT_CONNECT_TIMEOUT => 2000,
],
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100,
],
],
]
- Redis
Để sử dụng Redis với Laravel, bạn cần cài đặt PhpRedis PHP extension hoặc cài đặtpredis/predis
package (~1.0) bằng Composer. Sau đó bạn có thể cấu hình các thông tin kết nối trong fileconfig/cache.php
keyredis
:
'redis' => [
'driver' => 'redis',
'client' => 'predis',
'cluster' => env('REDIS_CLUSTER', false),
'clusters' => [
'default' => [
[
'scheme' => env('REDIS_SCHEME', 'tcp'),
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DATABASE', 0),
],
],
'options' => [
'cluster' => 'redis',
]
],
'options' => [
'parameters' => [
'password' => env('REDIS_PASSWORD', null),
'scheme' => env('REDIS_SCHEME', 'tcp'),
],
'ssl' => ['verify_peer' => false],
]
]
3. Sử dụng Cache
Trong Laravel, bạn có thể sử dụng Cache qua 2 cách là sử dụng Cache Facades (Illuminate\Support\Facades\Cache)
hoặc sử dụng cache()
helper function.
Retrieving Items From The Cache
Để lấy ra một giá trị từ bộ nhớ cache, các bạn sử dụng phương thức get
:
use Illuminate\Support\Facades\Cache;
Cache::get($key, $default);
trong đó:
$key
là key của cache đó.$default
là giá trị mặc định sẽ trả về nếu cache không tồn tại hoặc đã hết hạn. Mặc định giá trị mặc định sẽ lànull
.
Đối với trường hợp các bạn có muốn xử lí logic để trả về giá trị khi cache không tồn tại, bạn có thể sử dụng tham số thứ 2 là một closure function:
$value = Cache::get('key', function () {
return DB::table(...)->get();
});
Checking For Item Existence
Nếu bạn muốn kiểm tra một item nào đó có tồn tại trong cache hay không bạn có thể sử dụng phương thức has
.
if (Cache::has('key')) {
// Key exists
}
Incrementing / Decrementing Values
Hai hàm increment
và decrement
có thể được sử dụng để điều chỉnh giá trị của các items số nguyên nằm trong cache. Cả hai hàm này có tuỳ chọn cho phép tham số thứ hai chỉ định giá trị tăng giảm bao nhiêu cho cache item.
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
Retrieve & Store
Đôi lúc bạn muốn lấy ra một item trong cache, nhưng cũng muốn lưu giá trị mặc định cho item nếu như không tồn tại. Ví dụ, bạn muốn lấy tất cả users nằm trong cache hoặc, nếu chúng không tồn tại, thì sẽ lấy từ database và thêm vào trong cache. Bạn có thể thực hiện việc này bằng cách sử dụng hàm Cache::remember
:
$value = Cache::remember('users', $seconds, function () {
return DB::table('users')->get();
});
Nếu item không tồn tại trong cache, thì Closure
truyền vào trong hàm remember
sẽ được thực thi và kết quả sẽ được lưu lại vào trong cache.
Bạn có thể dùng rememberForever
để truy xuất item từ cache hoặc lưu nó vĩnh viễn nếu nó không tồn tại:
$value = Cache::rememberForever('users', function () {
return DB::table('users')->get();
});
Retrieve & Delete
Nếu bạn cần truy xuất item từ cache và sau đó xóa đi, bạn có thể dùng phương thức pull
. Giống như phương thức get
, giá trị null
sẽ được trả về nếu item không tồn tại trong cache từ trước đó:
$value = Cache::pull('key');
Storing Items In The Cache
Để lưu trữ một giá trị nào đó vào cache bạn có thể sử dụng phương thức put
:
Cache::put($key, $value, $timeToLife);
trong đó:
$key
là key của cache đó.$value
là giá trị cần cache vào key đó.$timetoLife
là thời gian tồn tại của cache (tính theo đơn vị giây).
Ví dụ: Lưu trữ giá trị vào cache key là 'username'
với thời gian tồn tại trong 1 phút.
Cache::put('username', 'Haposoft', 60);
- Để lưu trữ một vào cache vĩnh viễn, bạn có thể sử dụng phương thức
forever
.
Cache::forever('username', 'Haposoft');
Removing Items From The Cache
Bạn có thể xoá toàn bộ cache bằng cách dùng hàm flush
:
Cache::flush();
Việc xoá toàn bộ cache không hề tuân theo tiền tố cache nào, mà sẽ thực hiện xoá toàn bộ tất cả trong cache. Vì thế hãy thực sự cẩn trọng khi xoá một giá trị cache mà được sử dụng chung giữa các ứng dụng.
4. Kết luận
Trong bài viết này mình và các bạn đã cùng đi tìm hiểu những khái niệm cơ bản nhất về Cache trong Laravel. Hi vọng các bạn có thể hiểu và áp dụng trong các dự án thực tế.
Cảm ơn các bạn đã đọc bài viết! Xin chào và hẹn gặp lại!
Tài liệu tham khảo:
https://laravel.com/docs/8.x/cache
https://viblo.asia/p/laravel-57-tim-hieu-ve-cache-1VgZvo9rlAw