저자: Daniele Alessandri (suppakilla@gmail.com)
예제 #1
0
 /**
  * {@inheritdoc}
  */
 public function getConnection(CommandInterface $command)
 {
     $connection = $this->getConnectionInternal($command);
     if (!$connection->isConnected()) {
         // When we do not have any available slave in the pool we can expect
         // read-only operations to hit the master server.
         $expectedRole = $this->strategy->isReadOperation($command) && $this->slaves ? 'slave' : 'master';
         $this->assertConnectionRole($connection, $expectedRole);
     }
     return $connection;
 }
예제 #2
0
 /**
  * {@inheritdoc}
  */
 public function getConnectionByCommand(CommandInterface $command)
 {
     if (!$this->current) {
         if ($this->strategy->isReadOperation($command) && ($slave = $this->pickSlave())) {
             $this->current = $slave;
         } else {
             $this->current = $this->getMasterOrDie();
         }
         return $this->current;
     }
     if ($this->current === ($master = $this->getMasterOrDie())) {
         return $master;
     }
     if (!$this->strategy->isReadOperation($command) || !$this->slaves) {
         $this->current = $master;
     }
     return $this->current;
 }
예제 #3
0
    table.insert(hashes, redis.call('hgetall', key))
end
return hashes
LUA;
    public function getScript()
    {
        return self::BODY;
    }
}
// ------------------------------------------------------------------------- //
$parameters = array('tcp://127.0.0.1:6379/?alias=master', 'tcp://127.0.0.1:6380/?alias=slave');
$options = array('profile' => function ($options, $option) {
    $profile = $options->getDefault($option);
    $profile->defineCommand('hmgetall', 'HashMultipleGetAll');
    return $profile;
}, 'replication' => function () {
    $strategy = new ReplicationStrategy();
    $strategy->setScriptReadOnly(HashMultipleGetAll::BODY);
    $replication = new MasterSlaveReplication($strategy);
    return $replication;
});
// ------------------------------------------------------------------------- //
$client = new Predis\Client($parameters, $options);
// Execute the following commands on the master server using redis-cli:
// $ ./redis-cli HMSET metavars foo bar hoge piyo
// $ ./redis-cli HMSET servers master host1 slave host2
$hashes = $client->hmgetall('metavars', 'servers');
$replication = $client->getConnection();
$stillOnSlave = $replication->getCurrent() === $replication->getConnectionById('slave');
echo "Is still on slave? ", $stillOnSlave ? 'YES!' : 'NO!', PHP_EOL;
var_export($hashes);
예제 #4
0
 /**
  * @group disconnected
  */
 public function testSetLuaScriptAsReadOperationWorksWithScriptedCommandAndCallableCheck()
 {
     $strategy = new ReplicationStrategy();
     $command = $this->getMock('Predis\\Command\\ScriptedCommand', array('getScript'));
     $command->expects($this->any())->method('getScript')->will($this->returnValue($script = 'return true'));
     $command->setArguments(array('trigger', false));
     $strategy->setScriptReadOnly($script, true);
     $this->assertTrue($strategy->isReadOperation($command));
 }