場(chǎng)景
在業(yè)務(wù)量小的情況下,我們使用Redis單機(jī)連接池就可以滿足業(yè)務(wù)需求。因此,redis單機(jī)連接池就可以滿足我們的業(yè)務(wù)。因此我們會(huì)這樣寫:
示例
注冊(cè)連接池
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));
});
當(dāng)業(yè)務(wù)量上來后,我們需要切換成集群模式的時(shí)候怎么辦。因此我們做的應(yīng)該是:
注冊(cè)集群連接池
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],
]
));
老業(yè)務(wù)代碼
use EasySwoole\RedisPool\Redis;
use EasySwoole\Redis\Redis as RedisClient
Redis::invoke('redis', function (RedisClient $redis) {
var_dump($redis->set('a', 1));
});
對(duì)于之前的老業(yè)務(wù)代碼,就會(huì)出現(xiàn)、、、、此事,我的invoker回調(diào)參數(shù)是一個(gè)EasySwoole\Redis\RedisCluster
實(shí)例,而非EasySwoole\Redis\Redis
,
因此就會(huì)導(dǎo)致業(yè)務(wù)代碼報(bào)錯(cuò)。
解決方案
Easyswoole Redis Pool組件,在2.1.1版本開始,基于easyswoole的magic pool 引入一個(gè)cask機(jī)制。可以指定實(shí)例化的class。
定義一個(gè)class
namespace App\Utility;
use EasySwoole\Redis\Redis;
class RedisClient extends Redis
{
function fuck()
{
var_dump('waf');
}
}
該class繼承自
EasySwoole\Redis\Redis
注冊(cè)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));
});
遷移集群
修改注冊(cè)配置
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單機(jī)客戶端與集群客戶端的方法幾乎一致,因此可以不修改任何業(yè)務(wù)代碼,就是實(shí)現(xiàn)單機(jī)到集群的遷移