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

clipboard.png

使用

//具体参数含义 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
855 声望36 粉丝

sudo yum install girlfriend


« 上一篇
开发错误集锦
下一篇 »
golang 入门