Redis

webman/redisilluminate/redisを基に接続プール機能を追加したもので、コルーチンプログラムおよび非コルーチンプログラム環境をサポートし、使用方法はlaravelと同じです。

使用する前にilluminate/redisのためにphp-cliにredis拡張機能をインストールする必要があります。

注意
現在のマニュアルはwebman v2バージョンに対応しています。webman v1バージョンを使用している場合は、v1バージョンのマニュアルを参照してください。
このコンポーネントはredis拡張をインストールする必要があります。php -m | grep redisコマンドを使用してphp-cliがredis拡張をインストールしているか確認してください。

インストール

composer require -W webman/redis illuminate/events

インストール後、restart(再起動)する必要があります(reloadは無効です)

設定

redisの設定ファイルはconfig/redis.phpにあります。

return [
    'default' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 0,
        'pool' => [ // 接続プールの設定
            'max_connections' => 10,     // 接続プールの最大接続数
            'min_connections' => 1,      // 接続プールの最小接続数
            'wait_timeout' => 3,         // 接続プールから接続を取得する最大待機時間
            'idle_timeout' => 50,        // 接続プール内の接続がアイドル状態である最大時間、これを超えると接続が切断されて、接続数がmin_connectionsに達するまで続きます
            'heartbeat_interval' => 50,  // ヘルスチェック間隔、60秒を超えないようにしてください
        ],
    ]
];

接続プールについて

  • 各プロセスには自身の接続プールがあり、プロセス間で接続プールを共有しません。
  • コルーチンを開かない場合、ビジネスはプロセス内で順次実行されるため、同時実行が発生せず、接続プールには最大1つの接続のみです。
  • コルーチンを開くと、業務はプロセス内で並行して実行され、接続プールは必要に応じて接続数を動的に調整します。最大でmax_connectionsを超えず、最小でmin_connectionsを下回りません。
  • 接続プールの最大接続数がmax_connectionsであるため、Redisを操作するコルーチンの数がmax_connectionsを超えると、コルーチンが待機して最大でwait_timeout秒待機し、それを超えると例外が発生します。
  • アイドル状態の場合(コルーチン環境および非コルーチン環境の両方)、接続はidle_timeout時間後に回収され、接続数がmin_connectionsmin_connectionsは0でも可)になるまで続きます。

<?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インターフェース

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)

等価なもの

$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)
...

注意
Redis::select($db)インターフェースの使用に注意してください。webmanは常駐メモリのフレームワークであるため、あるリクエストがRedis::select($db)を使用してデータベースを切り替えると、以降の他のリクエストに影響を与えます。複数のデータベースを使用する場合、異なる$dbを異なるRedis接続設定として構成することをお勧めします。

複数のRedis接続を使用する

例えば、設定ファイル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,
    ],

]

デフォルトで使用されるのはdefaultに設定された接続です。Redis::connection()メソッドを使って、どのredis接続を使用するか選択できます。

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

クラスタ設定

アプリケーションがRedisサーバークラスタを使用する場合、Redis設定ファイルでclustersキーを使用してこれらのクラスタを定義する必要があります。

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

];

デフォルトでは、クラスタはノード上でクライアントシャーディングを実現し、ノードプールを実現し、大量の使用可能なメモリを作成できます。ここで注意が必要なのは、クライアント共有は失敗の状態を処理しないことです;したがって、この機能は主に他の主データベースから取得されたキャッシュデータに適用されます。Redisのネイティブクラスタを利用するには、設定ファイルのoptionsキーに以下のように指定する必要があります:

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

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

パイプラインコマンド

一つの操作でサーバーにたくさんのコマンドを送信する必要があるときは、パイプラインコマンドの使用をお勧めします。pipelineメソッドはRedisインスタンスのクロージャを受け取ります。すべてのコマンドをRedisインスタンスに送信でき、それらはすべて一つの操作で実行されます:

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