Redis

Redis là một thành phần mặc định của webman và sử dụng illuminate/redis, đây là thư viện redis của Laravel, sử dụng cách tương tự như Laravel.

Trước khi sử dụng illuminate/redis, bạn cần cài đặt extension redis cho php-cli.

Chú ý
Sử dụng lệnh php -m | grep redis để kiểm tra xem php-cli đã cài đặt extension redis hay chưa. Lưu ý rằng, ngay cả khi bạn đã cài đặt extension redis cho php-fpm, điều này không có nghĩa là bạn có thể sử dụng nó trong php-cli, vì php-cliphp-fpm là hai ứng dụng khác nhau và có thể sử dụng các tập tin cấu hình php.ini khác nhau. Sử dụng lệnh php --ini để xem tập tin cấu hình php.ini nào được sử dụng bởi php-cli.

Cài đặt

composer require -W illuminate/redis illuminate/events

Sau khi cài đặt, bạn cần restart (không phải reload) để áp dụng.

Cấu hình

Tệp cấu hình redis nằm trong config/redis.php

return [
    'default' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 0,
    ]
];

Ví dụ

<?php
namespace app\controller;

use support\Request;
use support\Redis;

class UserController
{
    public function db(Request $request)
    {
        $key = 'test_key';
        Redis::set($key, rand());
        return response(Redis::get($key));
    }
}

Redis Interface

Redis::append($key, $value)
Redis::bitCount($key)
Redis::decr($key, $value)
Redis::decrBy($key, $value)
Redis::get($key)
Redis::getBit($key, $offset)
Redis::getRange($key, $start, $end)
Redis::getSet($key, $value)
Redis::incr($key, $value)
Redis::incrBy($key, $value)
Redis::incrByFloat($key, $value)
Redis::mGet(array $keys)
Redis::getMultiple(array $keys)
Redis::mSet($pairs)
Redis::mSetNx($pairs)
Redis::set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null)
Redis::setBit($key, $offset, $value)
Redis::setEx($key, $ttl, $value)
Redis::pSetEx($key, $ttl, $value)
Redis::setNx($key, $value)
Redis::setRange($key, $offset, $value)
Redis::strLen($key)
Redis::del(...$keys)
Redis::exists(...$keys)
Redis::expire($key, $ttl)
Redis::expireAt($key, $timestamp)
Redis::select($dbIndex)

Tương đương với:

$redis = Redis::connection('default');
$redis->append($key, $value)
$redis->bitCount($key)
$redis->decr($key, $value)
$redis->decrBy($key, $value)
$redis->get($key)
$redis->getBit($key, $offset)
...

Chú ý
Hãy cẩn thận khi sử dụng giao diện Redis::select($db), vì webman là một framework ở bộ nhớ không thay đổi, nếu một yêu cầu sử dụng Redis::select($db) để chuyển đổi cơ sở dữ liệu, điều này sẽ ảnh hưởng đến các yêu cầu khác sau này. Đối với nhiều cơ sở dữ liệu, nên sử dụng cấu hình $db khác nhau cho các kết nối Redis khác nhau.

Sử dụng nhiều kết nối Redis

Ví dụ tệp cấu hình config/redis.php

return [
    'default' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 0,
    ],

    'cache' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 1,
    ],
]

Mặc định, kết nối được sử dụng là kết nối được cấu hình trong default, bạn có thể sử dụng phương thức Redis::connection() để chọn kết nối redis nào sẽ được sử dụng.

$redis = Redis::connection('cache');
$redis->get('test_key');

Cấu hình Cluster

Nếu ứng dụng của bạn sử dụng cụm máy chủ Redis, bạn nên sử dụng khóa cụm (clusters) trong tệp cấu hình Redis để xác định các cụm này:

return [
    'clusters' => [
        'default' => [
            [
                'host'     => 'localhost',
                'password' => null,
                'port'     => 6379,
                'database' => 0,
            ],
        ],
    ],

];

Mặc định, cụm có thể thực hiện phân mảnh trên các nút, cho phép bạn tạo ra một cụm nơi có nhiều bộ nhớ có sẵn. Lưu ý rằng chia sẻ khách hàng không xử lý trường hợp thất bại, vì vậy nó chủ yếu được sử dụng để lấy dữ liệu cache từ cơ sở dữ liệu chính khác. Nếu bạn muốn sử dụng cụm gốc Redis, bạn cần quy định như sau trong khóa options trong tệp cấu hình:

return [
    'options' => [
        'cluster' => 'redis',
    ],

    'clusters' => [
        // ...
    ],
];

Lệnh Pipeline

Khi bạn cần gửi nhiều lệnh đến máy chủ trong một lần thao tác, bạn nên sử dụng lệnh Pipeline. Phương thức pipeline nhận một closure của một Redis instance. Bạn có thể gửi tất cả các lệnh đến Redis, tất cả chúng sẽ được thực hiện trong một lần thao tác:

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