关于redis主从服务器配置就略过了,以下基于你已经配置好好,然后在laravel环境下如何使用。
配置
laravel 使用的是 predis 扩展
composer require predis/predis
vi config/database.php
'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 设置为true
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:
使用
//具体参数含义 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。