Redis

安装

  1. 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 配置选项
  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. 'cluster' => [
  9. 'enable' => (bool) env('REDIS_CLUSTER_ENABLE', false),
  10. 'name' => null,
  11. 'seeds' => [],
  12. ],
  13. 'pool' => [
  14. 'min_connections' => 1,
  15. 'max_connections' => 10,
  16. 'connect_timeout' => 10.0,
  17. 'wait_timeout' => 3.0,
  18. 'heartbeat' => -1,
  19. 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
  20. ],
  21. ],
  22. ];

使用

hyperf/redis 实现了 ext-redis 代理和连接池,用户可以直接通过依赖注入容器注入 \Hyperf\Redis\Redis 来使用 Redis 客户端,实际获得的是 \Redis 的一个代理对象。

  1. <?php
  2. use Hyperf\Utils\ApplicationContext;
  3. $container = ApplicationContext::getContainer();
  4. $redis = $container->get(Hyperf\Redis\Redis::class);
  5. $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. 'cluster' => [
  9. 'enable' => (bool) env('REDIS_CLUSTER_ENABLE', false),
  10. 'name' => null,
  11. 'seeds' => [],
  12. ],
  13. 'pool' => [
  14. 'min_connections' => 1,
  15. 'max_connections' => 10,
  16. 'connect_timeout' => 10.0,
  17. 'wait_timeout' => 3.0,
  18. 'heartbeat' => -1,
  19. 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
  20. ],
  21. ],
  22. // 增加一个名为 foo 的 Redis 连接池
  23. 'foo' => [
  24. 'host' => env('REDIS_HOST', 'localhost'),
  25. 'auth' => env('REDIS_AUTH', ''),
  26. 'port' => (int) env('REDIS_PORT', 6379),
  27. 'db' => 1,
  28. 'pool' => [
  29. 'min_connections' => 1,
  30. 'max_connections' => 10,
  31. 'connect_timeout' => 10.0,
  32. 'wait_timeout' => 3.0,
  33. 'heartbeat' => -1,
  34. 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
  35. ],
  36. ],
  37. ];

通过代理类使用

我们可以重写一个 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. use Hyperf\Utils\ApplicationContext;
  4. $container = ApplicationContext::getContainer();
  5. // 通过 DI 容器获取或直接注入 RedisFactory 类
  6. $redis = $container->get(RedisFactory::class)->get('foo');
  7. $result = $redis->keys('*');

集群模式

使用 name

配置 cluster,修改修改 redis.ini,也可以修改 Dockerfile 如下

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

对应 PHP 配置如下

  1. <?php
  2. // 省略其他配置
  3. return [
  4. 'default' => [
  5. 'cluster' => [
  6. 'enable' => true,
  7. 'name' => 'mycluster',
  8. 'seeds' => [],
  9. ],
  10. ],
  11. ];

使用 seeds

当然不配置 name 直接使用 seeds 也是可以的。如下

  1. <?php
  2. // 省略其他配置
  3. return [
  4. 'default' => [
  5. 'cluster' => [
  6. 'enable' => true,
  7. 'name' => null,
  8. 'seeds' => [
  9. '192.168.1.110:6379',
  10. '192.168.1.111:6379',
  11. ],
  12. ],
  13. ],
  14. ];

Options

用户可以修改 options,来设置 Redis 配置选项。

例如修改 Redis 序列化为 PHP 序列化。

  1. <?php
  2. declare(strict_types=1);
  3. return [
  4. 'default' => [
  5. 'host' => env('REDIS_HOST', 'localhost'),
  6. 'auth' => env('REDIS_AUTH', null),
  7. 'port' => (int) env('REDIS_PORT', 6379),
  8. 'db' => (int) env('REDIS_DB', 0),
  9. 'pool' => [
  10. 'min_connections' => 1,
  11. 'max_connections' => 10,
  12. 'connect_timeout' => 10.0,
  13. 'wait_timeout' => 3.0,
  14. 'heartbeat' => -1,
  15. 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
  16. ],
  17. 'options' => [
  18. Redis::OPT_SERIALIZER => Redis::SERIALIZER_PHP,
  19. ],
  20. ],
  21. ];

比如设置 Redis 永不超时

  1. <?php
  2. declare(strict_types=1);
  3. return [
  4. 'default' => [
  5. 'host' => env('REDIS_HOST', 'localhost'),
  6. 'auth' => env('REDIS_AUTH', null),
  7. 'port' => (int) env('REDIS_PORT', 6379),
  8. 'db' => (int) env('REDIS_DB', 0),
  9. 'pool' => [
  10. 'min_connections' => 1,
  11. 'max_connections' => 10,
  12. 'connect_timeout' => 10.0,
  13. 'wait_timeout' => 3.0,
  14. 'heartbeat' => -1,
  15. 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
  16. ],
  17. 'options' => [
  18. Redis::OPT_READ_TIMEOUT => -1,
  19. ],
  20. ],
  21. ];

有的 phpredis 扩展版本,optionvalue 必须是 string 类型。