Redis
webman/redis là một phần mở rộng trên cơ sở illuminate/redis với chức năng kết nối pool, hỗ trợ cả môi trường coroutine và không coroutine, cách sử dụng tương tự như laravel.
Trước khi sử dụng illuminate/redis
, bạn phải cài đặt phần mở rộng redis cho php-cli
.
Lưu ý
Tài liệu hiện tại là phiên bản webman v2, nếu bạn đang sử dụng phiên bản webman v1, hãy xem tài liệu phiên bản v1.
Phần mở rộng này cần cài đặt redis, sử dụng lệnhphp -m | grep redis
để kiểm tra xemphp-cli
có cài đặt phần mở rộng redis hay không.
Cài đặt
composer require -W webman/redis illuminate/events
Sau khi cài đặt, cần phải khởi động lại (reload không có tác dụng).
Cấu hình
Tập tin cấu hình redis nằm trong config/redis.php
return [
'default' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 0,
'pool' => [ // Cấu hình kết nối pool
'max_connections' => 10, // Số kết nối tối đa của pool
'min_connections' => 1, // Số kết nối tối thiểu của pool
'wait_timeout' => 3, // Thời gian chờ tối đa để lấy kết nối từ pool
'idle_timeout' => 50, // Thời gian kết nối trong pool nhàn rỗi sẽ bị thu hồi, vượt qua thời gian này sẽ bị đóng, cho đến khi số lượng kết nối là min_connections
'heartbeat_interval' => 50, // Khoảng thời gian kiểm tra heartbeat, không được lớn hơn 60 giây
],
]
];
Về kết nối pool
- Mỗi tiến trình có pool kết nối riêng, không chia sẻ pool kết nối giữa các tiến trình.
- Khi không bật coroutine, các nghiệp vụ sẽ được thực hiện theo hàng đợi trong tiến trình, không phát sinh đồng thời, do đó pool kết nối chỉ có tối đa 1 kết nối.
- Khi mở coroutine, các nghiệp vụ sẽ được thực hiện đồng thời trong tiến trình, pool kết nối sẽ tự động điều chỉnh số lượng kết nối theo nhu cầu, tối đa không vượt quá
max_connections
, tối thiểu không nhỏ hơnmin_connections
. - Vì số lượng kết nối tối đa của pool là
max_connections
, khi số lượng coroutine thao tác Redis lớn hơnmax_connections
, sẽ có các coroutine phải chờ đợi, tối đa chờ tớiwait_timeout
giây, nếu vượt quá sẽ kích hoạt ngoại lệ. - Trong trường hợp nhàn rỗi (bao gồm môi trường coroutine và không coroutine), kết nối sẽ bị thu hồi sau thời gian
idle_timeout
, cho đến khi số lượng kết nối làmin_connections
(min_connections
có thể là 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));
}
}
Giao diện Redis
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)
...
Lưu ý
Hãy sử dụng cẩn thận giao diệnRedis::select($db)
vì webman là một framework lưu giữ trong bộ nhớ. Nếu một yêu cầu sử dụngRedis::select($db)
để chuyển đổi cơ sở dữ liệu, nó sẽ ảnh hưởng đến các yêu cầu khác sau đó. Đối với nhiều cơ sở dữ liệu, khuyên bạn nên cấu hình khác nhau cho từng kết nối Redis với các$db
khác nhau.
Sử dụng nhiều kết nối Redis
Ví dụ, trong tập tin 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 sử dụng 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 cần 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 cluster máy chủ Redis, bạn nên sử dụng khóa clusters trong tập tin cấu hình Redis để xác định các cluster đó:
return [
'clusters' => [
'default' => [
[
'host' => 'localhost',
'password' => null,
'port' => 6379,
'database' => 0,
],
],
],
];
Mặc định, cluster có thể thực hiện phân đoạn phía client trên các nút, cho phép bạn tạo ra một pool nút và tạo ra một lượng bộ nhớ khả dụng lớn. Lưu ý rằng việc chia sẻ phía client sẽ không xử lý các trường hợp lỗi; do đó, chức năng này chủ yếu áp dụng cho dữ liệu cache lấy từ cơ sở dữ liệu chính khác. Nếu bạn muốn sử dụng cluster Redis thuần túy, bạn cần chỉ định như sau trong khóa options của tập tin cấu hình:
return[
'options' => [
'cluster' => 'redis',
],
'clusters' => [
// ...
],
];
Lệnh pipe
Khi bạn cần gửi nhiều lệnh đến server trong một thao tác, bạn nên sử dụng lệnh pipe. Phương thức pipeline nhận một Closure của một instance Redis. Bạn có thể gửi tất cả các lệnh đến instance Redis, chúng sẽ được thực hiện hoàn tất trong một thao tác:
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});