場景
在業務量小的情況下,我們使用Redis單機連接池就可以滿足業務需求。因此,redis單機連接池就可以滿足我們的業務。因此我們會這樣寫:
示例
注冊連接池
use EasySwoole\Redis\Config\RedisConfig;
use EasySwoole\RedisPool\Redis;
Redis::getInstance()->register('redis',new RedisConfig());
使用
use EasySwoole\RedisPool\Redis;
use EasySwoole\Redis\Redis as RedisClient
Redis::invoke('redis', function (RedisClient $redis) {
var_dump($redis->set('a', 1));
});
當業務量上來后,我們需要切換成集群模式的時候怎么辦。因此我們做的應該是:
注冊集群連接池
use EasySwoole\RedisPool\Redis;
use EasySwoole\Redis\Config\RedisClusterConfig;
Redis::getInstance()->register('redis',new RedisClusterConfig([
['172.16.253.156', 9001],
['172.16.253.156', 9002],
['172.16.253.156', 9003],
['172.16.253.156', 9004],
]
));
老業務代碼
use EasySwoole\RedisPool\Redis;
use EasySwoole\Redis\Redis as RedisClient
Redis::invoke('redis', function (RedisClient $redis) {
var_dump($redis->set('a', 1));
});
對于之前的老業務代碼,就會出現、、、、此事,我的invoker回調參數是一個EasySwoole\Redis\RedisCluster
實例,而非EasySwoole\Redis\Redis
,
因此就會導致業務代碼報錯。
解決方案
Easyswoole Redis Pool組件,在2.1.1版本開始,基于easyswoole的magic pool 引入一個cask機制。可以指定實例化的class。
定義一個class
namespace App\Utility;
use EasySwoole\Redis\Redis;
class RedisClient extends Redis
{
function fuck()
{
var_dump('waf');
}
}
該class繼承自
EasySwoole\Redis\Redis
注冊redis
use EasySwoole\Redis\Config\RedisConfig;
use EasySwoole\RedisPool\Redis;
use App\Utility\RedisClient
Redis::getInstance()->register('redis',$config,RedisClient::class);
使用redis
use EasySwoole\RedisPool\Redis;
use App\Utility\RedisClient
Redis::invoke('redis', function (RedisClient $redis) {
var_dump($redis->set('a', 1));
});
遷移集群
修改注冊配置
use EasySwoole\RedisPool\Redis;
use EasySwoole\Redis\Config\RedisClusterConfig;
Redis::getInstance()->register('redis',new RedisClusterConfig([
['172.16.253.156', 9001],
['172.16.253.156', 9002],
['172.16.253.156', 9003],
['172.16.253.156', 9004],
]
),RedisClient::class);
繼承修改
修改App\Utility\RedisClient
,讓它繼承EasySwoole\Redis\RedisCluster
即可
而由于redis單機客戶端與集群客戶端的方法幾乎一致,因此可以不修改任何業務代碼,就是實現單機到集群的遷移