Tớ đã sử dụng Redis trong Laravel như thế nào

Chào mọi người, trong bài viết trước mình đã hướng dẫn cách cài đặt Redis trên ubuntu 16.04, và lần này chúng ta sẽ áp dụng nó vào trong Laravel, bắt đầu thôi !

Cài đặt

Trước khi sử dụng redis, chúng ta sẽ cần phải cài gói predis/predis thông qua composer:

composer require predis/predis

Ngoài ra bạn cũng có thể cài PhpRedis extension thông qua PECL, bạn có thể tìm hiểu về nó, cài đặt sẽ phức tạp hơn nhưng có thể mang lại hiệu suất tốt hơn cho các ứng dụng sử dụng Redis.

cấu hình

File cấu hình redis nằm trong config/database.php, trong file này bạn sẽ thấy mảng redis với nội dung như sau:

'redis' => [

    'client' => 'predis',

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

    'cache' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],

],

trong file .env các bạn cần thay đổi lại 1 chút:

CACHE_DRIVER=redis

nếu như bạn có thay đổi cổng mặc định của Redis thì nhớ config lại REDIS_PORT trong .env nhé.

Cách sử dụng

set

Bạn có thể thao tác với redis bằng cách gọi các hàm của Redis facade và bạn có thể gọi bất kì câu lệnh redis nào ở bất cứ đâu, chúng ta sẽ bắt đầu với ví dụ về cách lưu trữ:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redis;
// hoặc nếu bạn sử dụng aliases
// use Redis;

class UserController extends Controller
{
    public function store()
    {
        // hàm set() gồm 2 giá trị truyền vào đó là key và value, như ví dụ thì key là 'name', còn value là 'Bach dz'
        $user = Redis::set('name', 'Bach dz');
    }
}

get

nhớ start redis nhé, bây giờ chúng ta sẽ kiểm tra xem dữ liệu đã được thêm hay chưa, mình sẽ thử ở terminal trước nhé:

$ redis-cli
127.0.0.1:6379> GET name
Output:
"Bach dz"

cú pháp sẽ là get KEY và mình đã set key là name, nếu kết quả trả ra như trên thì yep, bạn đã thực hiện đúng rồi đấy

Trong Laravel thì cú pháp để get dữ liệu từ redis ra như sau Redis::get('key'), ví dụ thêm 1 hàm trong UserController nhé:

public function getData()
{
        // hàm get() gồm 1 giá trị truyền vào đó là key
        $user = Redis::get('name');
        
        // dd() thử xem có đúng không nhé
        dd($user);
}

bạn chạy hàm getData() và kiểm tra nhé ^^

Pipelining Commands

bạn cần sử dụng tới Pipelining khi cần gửi nhiều lệnh tới server cùng lúc, ví dụ:

Redis::pipeline(function ($pipe) {
    for ($i = 0; $i < 1000; $i++) {
        $pipe->set("key:$i", $i);
    }
});

Pub / Sub

Laravel đã cung cấp interface tiện dụng cho redis publishsubscribe, nó cho phép bạn lắng nghe message từ "channel". Bạn có thể publish messages tới channel của ứng dụng khác nữa, hoặc sử dụng ngôn ngữ lập trình khác, cho phép dễ dàng giao tiếp giữa các ứng dụng và processes.

Yep...test nào, chúng ta sẽ setup một channel sử dụng subscribe method, tạo command bằng câu lệnh:

php artisan make:command RedisSubscribe

Chỉnh sửa lại fie command bạn vừa tạo trong app/Console/Commands/RedisSubscribe.php:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;

class RedisSubscribe extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'redis:subscribe';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Subscribe to a Redis channel';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        Redis::subscribe(['test-channel'], function ($message) {
            echo $message;
        });
    }
}

Bây giờ mình sẽ publish ở Route nhé

use Redis;

Route::get('publish', function () {
    // Route logic...

    Redis::publish('test-channel', json_encode(['foo' => 'bar']));
});

Wildcard Subscriptions

Sử dụng phương thức psubscribe, bạn có thể subscribe tới wildcard channel, nó sẽ hữu dụng cho việc nhận tất cả các message từ tất cả các channels. Biến $channel sẽ được truyền như là argument thứ 2 để cung cấp cho callback Closure, ví dụ:

Redis::psubscribe(['*'], function ($message, $channel) {
    echo $message;
});

Redis::psubscribe(['users.*'], function ($message, $channel) {
    echo $message;
});

Xóa dữ liệu

Đơn giản hoy, bạn sử dụng nó bằng cách Redis::del($key);. Ngoài ra ở $ redis-cli bạn có thể dùng cách:

127.0.0.1:6379> SET key1 "key 1"

127.0.0.1:6379> SET key2 "key 2"

127.0.0.1:6379> DEL key1 key2

Để xóa hết dữ liệu trong redis bạn sử dụng câu lệnh:

127.0.0.1:6379> FLUSHALL

Tổng kết

Như vậy là bạn đã có thể sử dụng Redis trong Laravel rồi, bạn có thể tìm hiểu thêm về commands trong redis tại đây. Tùy vào trường hợp mà sử dụng redis cho hợp lý nhé, cảm ơn đã đọc bài viết của mình ^^