关于redis主从服务器配置就略过了,如下基于你已经配置好好,而后在laravel环境下如何使用。php
laravel 使用的是 predis 扩展
composer require predis/predis
vi config/database.phplaravel
'redis'=>[ 'cluster' => false, 'default' => [ "tcp://" . env("REDIS_DEFAULT_HOST") . ":" . env("REDIS_DEFAULT_PORT") . "?database=0&alias=master",//主 "tcp://" . env("REDIS_DEFAULT_HOST_R") . ":" . env("REDIS_DEFAULT_PORT_R") . "?database=0&alias=slave_1",//从 "tcp://" . env("REDIS_DEFAULT_HOST_R2") . ":" . env("REDIS_DEFAULT_PORT_R2") . "?database=0&alias=slave_2",//从 ], 'test' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 1, ],//队列用到multi命令 'options' => [ 'replication' => true, 'connections' =>[ 'tcp' => '\App\Services\Redis', ], ], ]; //master slave vendor/predis/predis/src/Connection/Aggregate/SentinelReplication.php:189 public function add(NodeConnectionInterface $connection) { $alias = $connection->getParameters()->alias; if ($alias === 'master') { $this->master = $connection; } else { $this->slaves[$alias ?: count($this->slaves)] = $connection; } $this->reset(); } vi app/services/redis.php //参考 https://github.com/nrk/predis/blob/v1.1/examples/debuggable_connection.php namespace App\Services; use \Predis\Command\CommandInterface; use \Predis\Connection\StreamConnection; class Redis extends StreamConnection { private $tstart = 0; private $debugBuffer = []; public function connect() { $this->tstart = microtime(true); parent::connect(); } private function storeDebug(CommandInterface $command, $direction) { $firtsArg = $command->getArguments(); $timestamp = (microtime(true) - $this->tstart) * 1000; $log = []; $log['cmd'] = $command->getId(); $log['key'] = isset($firtsArg) ? $firtsArg : ' '; $log['server'] = "$direction $this"; $log['time'] = $timestamp; $data = ['server' => trim($log['server']), 'cmd' => $command->getId(), 'key' => $log['key'],'time' => $timestamp, 'msg' => ['host' => explode(':', trim($log['server']))[0], 'port' => explode(':', trim($log['server']))[1]]]]; openlog('syslog',LOG_PID|LOG_ODELAY,LOG_LOCAL7); syslog(LOG_INFO,json_encode($data)); closelog(); dump($log); $this->debugBuffer[] = $log; } public function writeRequest(CommandInterface $command) { parent::writeRequest($command); // $this->storeDebug($command, '->'); } public function readResponse(CommandInterface $command) { $response = parent::readResponse($command); $this->storeDebug($command, ''); return $response; } public function getDebugBuffer() { return $this->debugBuffer; } public static function debug() { $options = [ 'connections' =>[ 'tcp' => '\App\Services\Redis', ], ]; $client = new \Predis\Client(config('database.redis.default'), $options); $client->get('redis:test'); print_r($client->getConnection()); } }
看文档 https://github.com/nrk/predis 须要将 replication 设置为truegit
The basic configuration needed to use the client in replication mode requires one Redis server to be identified as the master (this can be done via connection parameters using the alias parameter set to master) and one or more servers acting as slaves:github
//具体参数含义 vendor/predis/predis/src/Connection/ParametersInterface.php:16 $redis = new \Predis\Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, 'read_write_timeout' => 0, ]); $redis = \Redis::connection('default'); $key = 'master:test'; $redis->set($key, 666);//tail -f /var/log/messages 查看Redis日志能够看到使用的从服务器 REDIS_DEFAULT_HOST_R dump($redis->get($key)); //查看Redis日志能够看到使用的主服务器 REDIS_DEFAULT_HOST