目录
一:背景
二:实现过程
三:总结
一:背景
在哨兵模式下,真实的redis服务地址由一个固定ip转变为可以变化的ip,这样我们业务代码在连接redis的时候,就需要判断哪个主redis服务地址,哪个是从redis服务地址,从而进行对应的读写操作。那么如何实现呢,下面我们使用php语言来具体讲解下,如果实现这个redis操作。
二:实现过程
1:首先获取哨兵的服务地址,根据哨兵获取主,从redis的地址信息
获取主,从库地址:
#哨兵服务的地址
$sentinels = [['host' => '192.168.56.101', 'port' => 5000],['host' => '192.168.56.101', 'port' => 5001],['host' => '192.168.56.101', 'port' => 5002], ];$masterName = 'mymaster'; $masterInfo = $slaveInfo = [];
#循环哨兵地址,连接获取主从服务的地址 foreach ($sentinels as $sentinel) {$redis = new \Redis();try {$redis->connect($sentinel['host'], $sentinel['port']);$masterInfo = $redis->rawCommand('sentinel', 'get-master-addr-by-name', $masterName);$redis->close();if ($masterInfo) {$slaves = $redis->rawCommand('sentinel','slaves',$masterName);if (!empty($slaves)) {foreach ($slaves as $val){$slaveInfo[]=['ip'=>$val[3],'port'=>$val[5]];}}break;}} catch (\Exception $e) {continue;} }
if (!$masterInfo) {echo 'Redis 连接失败!';exit; } #这里获取的主服务地址只有一个 #从服务地址是一个数组列表$rand = rand(0,1); $slaveInfo = $slaveInfo[$rand];
#上面我们随机选择一个从地址
2:根据主从地址,进行读写操作
#链接主库,进行写操作 $masterRedis = new \Redis(); $masterRedis->connect($masterInfo[0], $masterInfo[1]); $masterRedis->auth('123456'); if (!$masterRedis->set('test', '123')) {echo 'Redis 写入失败!';exit; } echo 'Redis 写入成功!' . "\n";#连接从服务,获取信息 $salveRedis = new \Redis(); $salveRedis->connect($slaveInfo['ip'], $slaveInfo['port']); $salveRedis->auth('123456'); if (!$salveRedis->exists('test')) {echo 'Redis 读取失败!';exit; } echo 'Redis 读取成功!' . $salveRedis->get('test');
三:总结
通过以上代码,我们可以根据自己的业务进行封装,获取主库进行写操作,获取从库进行读操作,可以实现哨兵模式下,redis读写分离,让我们的业务更加健壮和高可用。