Redis

安装

  1. composer require hyperf/redis

配置

配置项类型默认值备注
hoststring'localhost'Redis地址
authstring密码
portinteger6379端口
dbinteger0DB
  1. <?php
  2. return [
  3. 'default' => [
  4. 'host' => env('REDIS_HOST', 'localhost'),
  5. 'auth' => env('REDIS_AUTH', ''),
  6. 'port' => (int) env('REDIS_PORT', 6379),
  7. 'db' => (int) env('REDIS_DB', 0),
  8. 'pool' => [
  9. 'min_connections' => 1,
  10. 'max_connections' => 10,
  11. 'connect_timeout' => 10.0,
  12. 'wait_timeout' => 3.0,
  13. 'heartbeat' => -1,
  14. 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
  15. ],
  16. ],
  17. ];

使用

hyperf/redis 实现了 ext-redis 代理和连接池,用户可以直接使用\Redis客户端。

  1. <?php
  2. $redis = $this->container->get(\Redis::class);
  3. $result = $redis->keys('*');

多库配置

有时候在实际使用中,一个 Redis 库并不满足需求,一个项目往往需要配置多个库,这个时候,我们就需要修改一下配置文件 redis.php,如下:

  1. <?php
  2. return [
  3. 'default' => [
  4. 'host' => env('REDIS_HOST', 'localhost'),
  5. 'auth' => env('REDIS_AUTH', ''),
  6. 'port' => (int) env('REDIS_PORT', 6379),
  7. 'db' => (int) env('REDIS_DB', 0),
  8. 'pool' => [
  9. 'min_connections' => 1,
  10. 'max_connections' => 10,
  11. 'connect_timeout' => 10.0,
  12. 'wait_timeout' => 3.0,
  13. 'heartbeat' => -1,
  14. 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
  15. ],
  16. ],
  17. // 增加一个名为 foo 的 Redis 连接池
  18. 'foo' => [
  19. 'host' => env('REDIS_HOST', 'localhost'),
  20. 'auth' => env('REDIS_AUTH', ''),
  21. 'port' => (int) env('REDIS_PORT', 6379),
  22. 'db' => 1,
  23. 'pool' => [
  24. 'min_connections' => 1,
  25. 'max_connections' => 10,
  26. 'connect_timeout' => 10.0,
  27. 'wait_timeout' => 3.0,
  28. 'heartbeat' => -1,
  29. 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
  30. ],
  31. ],
  32. ];

通过代理类使用

我们可以重写一个 FooRedis 类并继承 Hyperf\Redis\Redis 类,修改 poolName 为上述的 foo,即可完成对连接池的切换,示例:

  1. <?php
  2. use Hyperf\Redis\Redis;
  3. class FooRedis extends Redis
  4. {
  5. // 对应的 Pool 的 key 值
  6. protected $poolName = 'foo';
  7. }
  8. // 通过 DI 容器获取或直接注入当前类
  9. $redis = $this->container->get(FooRedis::class);
  10. $result = $redis->keys('*');

使用工厂类

在每个库对应一个静态的场景时,通过代理类是一种很好的区分的方法,但有时候需求可能会更加的动态,这时候我们可以通过 Hyperf\Redis\RedisFactory 工厂类来动态的传递 poolName 来获得对应的连接池的客户端,而无需为每个库创建代理类,示例如下:

  1. <?php
  2. use Hyperf\Redis\RedisFactory;
  3. // 通过 DI 容器获取或直接注入 RedisFactory 类
  4. $redis = $this->container->get(RedisFactory::class)->get('foo');
  5. $result = $redis->keys('*');