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ư MemcachedRedis.
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 driver database để 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 file config/cache.php với key memcached:
'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 đặt predis/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 file config/cache.php key redis:
'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 incrementdecrement 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