mirror of
https://gitee.com/hyperf/hyperf.git
synced 2024-12-05 05:07:58 +08:00
8.5 KiB
8.5 KiB
Redis
安裝
composer require hyperf/redis
配置
配置項 | 類型 | 默認值 | 備註 |
---|---|---|---|
host | string | 'localhost' | Redis 地址 |
auth | string | 無 | 密碼 |
port | integer | 6379 | 端口 |
db | integer | 0 | DB |
cluster.enable | boolean | false | 是否集羣模式 |
cluster.name | string | null | 集羣名 |
cluster.seeds | array | [] | 集羣連接地址數組 ['host:port'] |
pool | object | {} | 連接池配置 |
options | object | {} | Redis 配置選項 |
<?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),
],
],
];
publish
完整配置文件使用命令
php bin/hyperf.php vendor:publish hyperf/redis
使用
hyperf/redis
實現了 ext-redis
代理和連接池,用户可以直接通過依賴注入容器注入 \Hyperf\Redis\Redis
來使用 Redis 客户端,實際獲得的是 \Redis
的一個代理對象。
<?php
use Hyperf\Utils\ApplicationContext;
$container = ApplicationContext::getContainer();
$redis = $container->get(\Hyperf\Redis\Redis::class);
$result = $redis->keys('*');
多庫配置
有時候在實際使用中,一個 Redis
庫並不滿足需求,一個項目往往需要配置多個庫,這個時候,我們就需要修改一下配置文件 redis.php
,如下:
<?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),
],
],
// 增加一個名為 foo 的 Redis 連接池
'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),
],
],
];
通過代理類使用
我們可以重寫一個 FooRedis
類並繼承 Hyperf\Redis\Redis
類,修改 poolName
為上述的 foo
,即可完成對連接池的切換,示例:
<?php
use Hyperf\Redis\Redis;
class FooRedis extends Redis
{
// 對應的 Pool 的 key 值
protected $poolName = 'foo';
}
// 通過 DI 容器獲取或直接注入當前類
$redis = $this->container->get(FooRedis::class);
$result = $redis->keys('*');
使用工廠類
在每個庫對應一個固定的使用場景時,通過代理類是一種很好的區分的方法,但有時候需求可能會更加的動態,這時候我們可以通過 Hyperf\Redis\RedisFactory
工廠類來動態的傳遞 poolName
來獲得對應的連接池的客户端,而無需為每個庫創建代理類,示例如下:
<?php
use Hyperf\Redis\RedisFactory;
use Hyperf\Utils\ApplicationContext;
$container = ApplicationContext::getContainer();
// 通過 DI 容器獲取或直接注入 RedisFactory 類
$redis = $container->get(RedisFactory::class)->get('foo');
$result = $redis->keys('*');
哨兵模式
開啟哨兵模式可以在.env
或 redis.php
配置文件中修改如下
多個哨兵節點使用;
分割
REDIS_HOST=
REDIS_AUTH=Redis實例密碼
REDIS_PORT=
REDIS_DB=
REDIS_SENTINEL_ENABLE=true
REDIS_SENTINEL_PASSWORD=Redis哨兵密碼
REDIS_SENTINEL_NODE=192.168.89.129:26381;192.168.89.129:26380;
return [
'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'auth' => env('REDIS_AUTH', null),
'port' => (int) env('REDIS_PORT', 6379),
'db' => (int) env('REDIS_DB', 0),
'timeout' => 30.0,
'reserved' => null,
'retry_interval' => 0,
'sentinel' => [
'enable' => (bool) env('REDIS_SENTINEL_ENABLE', false),
'master_name' => env('REDIS_MASTER_NAME', 'mymaster'),
'nodes' => explode(';', env('REDIS_SENTINEL_NODE', '')),
'persistent' => false,
'read_timeout' => 30.0,
'auth' => env('REDIS_SENTINEL_PASSWORD', ''),
],
'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),
],
],
];
集羣模式
使用 name
配置 cluster
,修改修改 redis.ini
,也可以修改 Dockerfile
如下
# - 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 \
對應 PHP 配置如下
<?php
// 省略其他配置
return [
'default' => [
'cluster' => [
'enable' => true,
'name' => 'mycluster',
'seeds' => [],
],
],
];
使用 seeds
當然不配置 name 直接使用 seeds 也是可以的。如下
<?php
// 省略其他配置
return [
'default' => [
'cluster' => [
'enable' => true,
'name' => null,
'seeds' => [
'192.168.1.110:6379',
'192.168.1.111:6379',
],
],
],
];
Options
用户可以修改 options
,來設置 Redis
配置選項。
例如修改 Redis
序列化為 PHP
序列化。
<?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,
],
],
];
比如設置 Redis
永不超時
<?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,
],
],
];
有的
phpredis
擴展版本,option
的value
必須是string
類型。