laravel redis 主从配置

关于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:

《laravel redis 主从配置》

使用

//具体参数含义 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
               
    原文作者:dream
    原文地址: https://segmentfault.com/a/1190000016522294
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞