场景

在业务量小的情况下,我们使用Redis单机连接池就可以满足业务需求。因此,redis单机连接池就可以满足我们的业务。因此我们会这样写:

示例

注册连接池

  1. use EasySwoole\Redis\Config\RedisConfig;
  2. use EasySwoole\RedisPool\Redis;
  3. Redis::getInstance()->register('redis',new RedisConfig());

使用

  1. use EasySwoole\RedisPool\Redis;
  2. use EasySwoole\Redis\Redis as RedisClient
  3. Redis::invoke('redis', function (RedisClient $redis) {
  4. var_dump($redis->set('a', 1));
  5. });

当业务量上来后,我们需要切换成集群模式的时候怎么办。因此我们做的应该是:

注册集群连接池

  1. use EasySwoole\RedisPool\Redis;
  2. use EasySwoole\Redis\Config\RedisClusterConfig;
  3. Redis::getInstance()->register('redis',new RedisClusterConfig([
  4. ['172.16.253.156', 9001],
  5. ['172.16.253.156', 9002],
  6. ['172.16.253.156', 9003],
  7. ['172.16.253.156', 9004],
  8. ]
  9. ));

老业务代码

  1. use EasySwoole\RedisPool\Redis;
  2. use EasySwoole\Redis\Redis as RedisClient
  3. Redis::invoke('redis', function (RedisClient $redis) {
  4. var_dump($redis->set('a', 1));
  5. });

对于之前的老业务代码,就会出现、、、、此事,我的invoker回调参数是一个EasySwoole\Redis\RedisCluster实例,而非EasySwoole\Redis\Redis, 因此就会导致业务代码报错。

解决方案

Easyswoole Redis Pool组件,在2.1.1版本开始,基于easyswoole的magic pool 引入一个cask机制。可以指定实例化的class。

定义一个class

  1. namespace App\Utility;
  2. use EasySwoole\Redis\Redis;
  3. class RedisClient extends Redis
  4. {
  5. function fuck()
  6. {
  7. var_dump('waf');
  8. }
  9. }

该class继承自EasySwoole\Redis\Redis

注册redis

  1. use EasySwoole\Redis\Config\RedisConfig;
  2. use EasySwoole\RedisPool\Redis;
  3. use App\Utility\RedisClient
  4. Redis::getInstance()->register('redis',$config,RedisClient::class);

使用redis

  1. use EasySwoole\RedisPool\Redis;
  2. use App\Utility\RedisClient
  3. Redis::invoke('redis', function (RedisClient $redis) {
  4. var_dump($redis->set('a', 1));
  5. });

迁移集群

修改注册配置

  1. use EasySwoole\RedisPool\Redis;
  2. use EasySwoole\Redis\Config\RedisClusterConfig;
  3. Redis::getInstance()->register('redis',new RedisClusterConfig([
  4. ['172.16.253.156', 9001],
  5. ['172.16.253.156', 9002],
  6. ['172.16.253.156', 9003],
  7. ['172.16.253.156', 9004],
  8. ]
  9. ),RedisClient::class);

继承修改

修改App\Utility\RedisClient,让它继承EasySwoole\Redis\RedisCluster即可

而由于redis单机客户端与集群客户端的方法几乎一致,因此可以不修改任何业务代码,就是实现单机到集群的迁移