hyperf/zh/redis.md

131 lines
3.3 KiB
Markdown
Raw Normal View History

2019-04-03 13:49:47 +08:00
# Redis
## 安装
```
composer require hyperf/redis
```
## 配置
| 配置项 | 类型 | 默认值 | 备注 |
|:------:|:-------:|:-----------:|:---------:|
| host | string | 'localhost' | Redis地址 |
| auth | string | 无 | 密码 |
| port | integer | 6379 | 端口 |
| db | integer | 0 | DB |
```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),
'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),
],
],
];
```
## 使用
`hyperf/redis` 实现了 `ext-redis` 代理和连接池,用户可以直接使用\Redis客户端。
```php
<?php
$redis = $this->container->get(\Redis::class);
$result = $redis->keys('*');
```
## 多库配置
2019-06-03 02:27:09 +08:00
有时候在实际使用中,一个 `Redis` 库并不满足需求,一个项目往往需要配置多个库,这个时候,我们就需要修改一下配置文件 `redis.php`,如下:
2019-04-03 13:49:47 +08:00
```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),
'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),
],
],
2019-06-03 02:27:09 +08:00
// 增加一个名为 foo 的 Redis 连接池
'foo' => [
2019-04-03 13:49:47 +08:00
'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),
],
],
];
```
2019-06-03 02:27:09 +08:00
### 通过代理类使用
2019-05-27 15:08:43 +08:00
2019-06-03 02:27:09 +08:00
我们可以重写一个 `FooRedis` 类并继承 `Hyperf\Redis\Redis` 类,修改 `poolName` 为上述的 `foo`,即可完成对连接池的切换,示例:
2019-04-03 13:49:47 +08:00
```php
2019-06-03 02:27:09 +08:00
<?php
2019-04-03 13:49:47 +08:00
use Hyperf\Redis\Redis;
2019-06-03 02:27:09 +08:00
class FooRedis extends Redis
2019-04-03 13:49:47 +08:00
{
2019-06-03 02:27:09 +08:00
// 对应的 Pool 的 key 值
protected $poolName = 'foo';
2019-04-03 13:49:47 +08:00
}
2019-06-03 02:27:09 +08:00
// 通过 DI 容器获取或直接注入当前类
$redis = $this->container->get(FooRedis::class);
2019-04-03 13:49:47 +08:00
$result = $redis->keys('*');
2019-05-27 15:08:43 +08:00
```
### 使用工厂类
2019-06-03 02:27:09 +08:00
在每个库对应一个静态的场景时,通过代理类是一种很好的区分的方法,但有时候需求可能会更加的动态,这时候我们可以通过 `Hyperf\Redis\RedisFactory` 工厂类来动态的传递 `poolName` 来获得对应的连接池的客户端,而无需为每个库创建代理类,示例如下:
2019-05-27 15:08:43 +08:00
```php
2019-06-03 02:27:09 +08:00
<?php
2019-05-27 15:08:43 +08:00
use Hyperf\Redis\RedisFactory;
2019-06-03 02:27:09 +08:00
// 通过 DI 容器获取或直接注入 RedisFactory 类
$redis = $this->container->get(RedisFactory::class)->get('foo');
2019-05-27 15:08:43 +08:00
$result = $redis->keys('*');
```