redis 一主三从三哨兵 每个从机和每个哨兵都是不一样的端口 先启用主机 在启动从机 (windows下)(主机可写可读)(从机只能读不能写)
复制三个redis文件夹(从机)(文件名redis+端口号):
每个从机中需要复制 redis的启动exe文件和配置文件 (redis-server.exe , redis.windows.conf)
redis.windows.conf 需要配置
port 6380 //设置从机的端口,不能和主机的端口相同
slaveof 127.0.0.1 6379 //从机绑定主机
bat文件启动从机: redis-server.exe redis.windows.conf
哨兵(复制3个文件夹)(文件名sentinel+端口号)
每个哨兵中复制 redis的启动exe文件和配置文件 (redis-server.exe ,sentinel.conf)
哨兵配置文件(sentinel.conf):
bind 0.0.0.0
port 26379
sentinel monitor seckill 127.0.0.1 6379 1
sentinel down-after-milliseconds seckill 5000
sentinel failover-timeout seckill 15000
bat文件启动哨兵:redis-server.exe sentinel.conf --sentinel
哨兵在主服务当掉后,会从从服务中选取一个当成主服务
监控运行状态,如果master出现故障,将从slave中投票出一个master,继续对外服务
操作redis集群类;
class RedisSentinel
{
public $redis;
public $master;
public $slaver;
public function __construct()
{
$this->master = new \Redis();
$this->slaves = new \Redis();
$this->_connect();
}
private function _connect()
{
$redis = new \Redis();
$host = '127.0.0.1';
//链接sentinel服务,host为ip,port为端口
$port = ['6379','6380'];
foreach($port as $k=>$v){
if($redis->connect($host,$v)){
$this->redis=$redis;
$master[] = $this->parseArrayResult($redis->rawCommand('SENTINEL','master','seckill'));
$slaves = $redis->rawCommand('SENTINEL','slaves','seckill');
$slavesIndex = array_rand($slaves);//获取数组的键
$slaves = $this->parseArrayResult($slaves[$slavesIndex]);
$this->parseArrayResult($this->slaves)
break;
}
}
//master是主服务,在其他的方法中引入后可直接调用;链接redis
$this->master->$redis->connect($master['ip'],$master['port']);
//slave是从服务
$this->slaver->$redis->connect($slaves['ip'],$slaves['port']);
}
//这个方法可以将以上sentinel返回的信息解析为数组
function parseArrayResult(array $data)
{
$result = array();
$count = count($data);
for ($i = 0; $i < $count;) {
$record = $data[$i];
if (is_array($record)) {
$result[] = parseArrayResult($record);
$i++;
} else {
$result[$record] = $data[$i + 1];
$i += 2;
}
}
return $result;
}
public function setRedisCahe($key,$value,$time=600)
{
$this->master->set($key,$value,$time);
}
public function getRedisCahe($key)
{
$this->slaver->get($key);
}
}