hyperf/docs/en/redis.md
2020-08-11 00:28:32 +08:00

7.1 KiB

Redis

Installation

composer require hyperf/redis

Configuration

Config Type Default Value Comment
host string 'localhost' The host of Redis Server
auth string null The password of Redis Server
port integer 6379 The port of Redis Server
db integer 0 The DB of Redis Server
cluster.enable boolean false Is it cluster mode ?
cluster.name string null The cluster name
cluster.seeds array [] The seeds of cluster, format: ['host:port']
pool object {} The connection pool
options object {} The options of Redis Client
<?php
return [
    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'auth' => env('REDIS_AUTH', ''),
        'port' => (int) env('REDIS_PORT', 6379),
        'db' => (int) env('REDIS_DB', 0),
        'cluster' => [
            'enable' => (bool) env('REDIS_CLUSTER_ENABLE', false),
            'name' => null,
            'seeds' => [],
        ],
        'pool' => [
            'min_connections' => 1,
            'max_connections' => 10,
            'connect_timeout' => 10.0,
            'wait_timeout' => 3.0,
            'heartbeat' => -1,
            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
        ],
    ],
];

Usage

hyperf/redis implemented the proxy of ext-redis and the connection pool, you could use \Redis class directly.

<?php

$redis = $this->container->get(\Redis::class);

$result = $redis->keys('*');

Multi-resource configuration

Sometimes, a single Redis resource can not meet the needs, and a project often needs to configure multiple resources. At this time, we could modify the configuration file redis.php as follows:

<?php

return [
    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'auth' => env('REDIS_AUTH', ''),
        'port' => (int) env('REDIS_PORT', 6379),
        'db' => (int) env('REDIS_DB', 0),
        'cluster' => [
            'enable' => (bool) env('REDIS_CLUSTER_ENABLE', false),
            'name' => null,
            'seeds' => [],
        ],
        'pool' => [
            'min_connections' => 1,
            'max_connections' => 10,
            'connect_timeout' => 10.0,
            'wait_timeout' => 3.0,
            'heartbeat' => -1,
            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
        ],
    ],
    // Added a named `foo` redis connection pool
    'foo' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'auth' => env('REDIS_AUTH', ''),
        'port' => (int) env('REDIS_PORT', 6379),
        'db' => 1,
        'pool' => [
            'min_connections' => 1,
            'max_connections' => 10,
            'connect_timeout' => 10.0,
            'wait_timeout' => 3.0,
            'heartbeat' => -1,
            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
        ],
    ],
];

Use through proxy class

We could rewrite a FooRedis class and inherit the Hyperf\Redis\Redis class, and modify the poolName property to the above foo, to complete the switch of the connection pool, for example:

<?php

use Hyperf\Redis\Redis;

class FooRedis extends Redis
{
    // The key value of the corresponding Pool
    protected $poolName = 'foo';
}

// Obtain or directly inject the current class through the DI container
$redis = $this->container->get(FooRedis::class);

$result = $redis->keys('*');

Use through factory

When each resource corresponds to a static scene, the proxy class is a good way to distinguish the resources, but sometimes the demand may be more dynamic. At this time, we could use the Hyperf\Redis\RedisFactory factory class to dynamically pass poolName argument to retrieve the client of the corresponding connection pool without creating a proxy class for each resource, for example:

<?php

use Hyperf\Redis\RedisFactory;

// Obtain or directly inject the RedisFactory class through the DI container
$redis = $this->container->get(RedisFactory::class)->get('foo');

$result = $redis->keys('*');

Cluster mode

Cluster name

Configure cluster, modify redis.ini, or modify Dockerfile, as follows:

    # - config PHP
    && { \
        echo "upload_max_filesize=100M"; \
        echo "post_max_size=108M"; \
        echo "memory_limit=1024M"; \
        echo "date.timezone=${TIMEZONE}"; \
        echo "redis.clusters.seeds = \"mycluster[]=localhost:7000&mycluster[]=localhost:7001\""; \
        echo "redis.clusters.timeout = \"mycluster=5\""; \
        echo "redis.clusters.read_timeout = \"mycluster=10\""; \
        echo "redis.clusters.auth = \"mycluster=password\"";
    } | tee conf.d/99-overrides.ini \

The corresponding PHP configuration is as follows

<?php
// ./config/autoload/redis.php
// Ignore the other irrelevant configurations
return [
    'default' => [
        'cluster' => [
            'enable' => true,
            'name' => 'mycluster',
            'seeds' => [],
        ],
    ],
];

Seeds

Of course, it is also available to use seeds directly without configuring the name, as follows:

<?php
// Ignore the other irrelevant configurations
return [
    'default' => [
        'cluster' => [
            'enable' => true,
            'name' => null,
            'seeds' => [
                '192.168.1.110:6379',
                '192.168.1.111:6379',
            ],
        ],
    ],
];

Options

You could define options configuration to set the options of Redis Client.

For example, use PHP Serializer to serialize the result:

<?php

declare(strict_types=1);

return [
    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'auth' => env('REDIS_AUTH', null),
        'port' => (int) env('REDIS_PORT', 6379),
        'db' => (int) env('REDIS_DB', 0),
        'pool' => [
            'min_connections' => 1,
            'max_connections' => 10,
            'connect_timeout' => 10.0,
            'wait_timeout' => 3.0,
            'heartbeat' => -1,
            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
        ],
        'options' => [
            Redis::OPT_SERIALIZER => Redis::SERIALIZER_PHP,
        ],
    ],
];

For example, set the redis client never timeout:

<?php

declare(strict_types=1);

return [
    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'auth' => env('REDIS_AUTH', null),
        'port' => (int) env('REDIS_PORT', 6379),
        'db' => (int) env('REDIS_DB', 0),
        'pool' => [
            'min_connections' => 1,
            'max_connections' => 10,
            'connect_timeout' => 10.0,
            'wait_timeout' => 3.0,
            'heartbeat' => -1,
            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
        ],
        'options' => [
            Redis::OPT_READ_TIMEOUT => -1,
        ],
    ],
];

Notice that, in some versions of phpredis extension, the value type of options has to string.