Skip to content

Redis

Giới thiệu (Introduction)

Redis là in-memory data structure store mã nguồn mở — được sử dụng làm database, cache, message broker, và streaming engine. Laravel tích hợp Redis qua extension phpredis hoặc package predis/predis.

Cấu hình (Configuration)

File cấu hình: config/database.php (section redis):

php
'redis' => [
    'client' => env('REDIS_CLIENT', 'phpredis'),

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

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

Clusters

php
'redis' => [
    'client' => env('REDIS_CLIENT', 'phpredis'),

    'clusters' => [
        'default' => [
            [
                'host' => env('REDIS_HOST', 'localhost'),
                'password' => env('REDIS_PASSWORD'),
                'port' => env('REDIS_PORT', '6379'),
                'database' => 0,
            ],
        ],
    ],
],

Predis

bash
composer require predis/predis:^2.0
env
REDIS_CLIENT=predis

PhpRedis

PhpRedis có hiệu suất tốt hơn. Cài đặt qua PECL:

bash
pecl install redis

Tương tác với Redis

php
use Illuminate\Support\Facades\Redis;

// Set / Get
Redis::set('name', 'Taylor');
$value = Redis::get('name');

// Gọi bất kỳ Redis command nào
$values = Redis::lrange('names', 5, 10);

// Connection cụ thể
$redis = Redis::connection('cache');
$value = $redis->get('name');

Transactions

php
Redis::transaction(function ($redis) {
    $redis->incr('user_visits', 1);
    $redis->incr('total_visits', 1);
});

LƯU Ý

Redis transactions không hỗ trợ rollback. Nếu lệnh lỗi trong transaction, các lệnh khác vẫn tiếp tục thực thi.

Pipelining Commands

Gửi nhiều commands cùng lúc (giảm network roundtrips):

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

Pub/Sub

Subscribe

php
use Illuminate\Support\Facades\Redis;

Redis::subscribe(['test-channel'], function (string $message) {
    echo $message;
});

Wildcard Subscriptions

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

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

Publish

php
use Illuminate\Support\Facades\Redis;

Route::get('/publish', function () {
    Redis::publish('test-channel', json_encode([
        'name' => 'Adam Wathan',
    ]));
});

Subscribe Command

Tạo artisan command cho subscribing:

php
// Trong artisan command
$this->info('Subscribing to test-channel...');

Redis::subscribe(['test-channel'], function (string $message) {
    $this->info($message);
});

Chạy: php artisan redis:subscribe