Commit Graph

54 Commits

Author SHA1 Message Date
Daniele Alessandri 76ee6a2f24 Merge remote-tracking branch 'github/pr/208'
Conflicts:
	README.md
	composer.json
2014-09-05 11:01:47 +02:00
Thibaud BARDIN 3d10be888c Change order of throws 2014-09-01 03:10:08 +02:00
Thibaud BARDIN 0fc5c5ee77 [phpdoc] Fix missing throws of phpdoc headers. 2014-08-09 23:14:45 +02:00
Daniele Alessandri 99f4312a6f Apply workaround for bug in versions of PHP < 5.3.9.
This change is needed to address a bug in older versions of PHP 5.3
affecting inheritance (see https://bugs.php.net/bug.php?id=66818).
2014-08-08 15:49:05 +02:00
Daniele Alessandri 65c2f4bc4f Back to development.
[ci skip]
2014-08-08 13:57:05 +02:00
Daniele Alessandri d4be306d0a ... and here comes Predis v1.0.0! 2014-08-01 11:59:50 +02:00
Daniele Alessandri f5ba47ad74 Change response parser for ZSCAN to match changes applied to ZRANGE. 2014-07-30 16:45:00 +02:00
Daniele Alessandri fbb0236840 Apply minor code-styling changes. 2014-07-30 15:30:02 +02:00
Daniele Alessandri ba5e501346 Use arguments as defined by Redis when calling WATCH internally. 2014-07-30 14:18:20 +02:00
Daniele Alessandri ab9cbe712f Specify type hint in interface. 2014-07-30 11:31:31 +02:00
Daniele Alessandri b6389e4a03 Switch to "3.0" as the default server profile.
Redis 3.0 does not really change much in terms of commands (most of
the ones implemented in the "unstable" branch have been backported to
the "2.8" branch after all) aside from a few cluster-related ones, so
we can bump the default version without worries.
2014-07-28 20:36:12 +02:00
Daniele Alessandri dedc1ba0a9 Move command "COMMAND" to the server profile for Redis 2.8.
This command has been backported from the "unstable" branch of Redis
to the "2.8" one, and it is available since 2.8.13.
2014-07-28 20:30:09 +02:00
Daniele Alessandri df653a7c00 Minor code styling and phpdoc changes. 2014-07-28 12:04:07 +02:00
Daniele Alessandri 45e351be79 [phpdoc] Fix formatting of phpdoc headers. 2014-07-27 23:59:37 +02:00
Daniele Alessandri b5cdab35c7 Remove useless argument from method signatures in WebdisConnection. 2014-07-27 23:06:21 +02:00
Daniele Alessandri dbfc1a74ba More random fixes after inspection. 2014-07-27 23:06:17 +02:00
Daniele Alessandri 4e1186f845 [phpdoc] Fix undefined classes. 2014-07-27 21:57:50 +02:00
Daniele Alessandri aa5c893d5a [phpdoc] Fix undefined namespaces. 2014-07-27 21:57:40 +02:00
Daniele Alessandri fff303a03b Comply with PSR-2 on intentional fall-through in non-empty case. 2014-07-27 21:57:40 +02:00
Daniele Alessandri 78ec22563a The \Iterator interface returns void for next(). 2014-07-27 21:57:40 +02:00
Daniele Alessandri 30254a2594 [phpdoc] Various phpdoc fixes. 2014-07-27 21:57:13 +02:00
Daniele Alessandri f372029cfc Fix code smells. 2014-07-27 20:13:24 +02:00
Daniele Alessandri 87aba18002 Merge branch 'v1.0/phpdocs' 2014-07-27 19:19:44 +02:00
Daniele Alessandri dc33d62b77 Miscellaneous fixes for "use" directives. 2014-07-27 19:19:20 +02:00
Daniele Alessandri b230e243f5 Predis\PubSub\DispatcherLoop should take a PubSub consumer instance. 2014-07-27 16:53:46 +02:00
Daniele Alessandri 31e2516156 Makes it easier to use a custom parameters class.
Simply overriding one method of the standard connection factory class,
used internally by Predis, allows developers to use their own custom
connection parameters classes through the whole library.

For example, in order to support Heroku-style URIs one can do:

  class HerokuParameters extends Predis\Connection\Parameters
  {
    protected function filter(array $parameters)
    {
      if (
        isset($parameters['scheme']) &&
        $parameters['scheme'] === 'redis'
      ) {
        $parameters['scheme'] = 'tcp';
      }

      if (isset($parameters['pass'])) {
        $parameters['password'] = $parameters['pass'];
      }

      unset($parameters['user'], $parameters['pass']);

      return $parameters;
    }
  }

  class ConnectionFactory extends Predis\Connection\Factory
  {
    protected function createParameters($parameters)
    {
      return HerokuParameters::create($parameters);
    }
  }

  $client = new Predis\Client($_ENV['REDISCLOUD_URL'], [
    'connections' => new ConnectionFactory()
  ]);

This idea comes in response to #196, but since we do not want to bake
support for SaaS-specific URIs in Predis this is the best compromise
we can offer leave developers free to implement their own logic for
handling these kind of URIs with the additional benefit of having it
available through the whole library (think of cluster or replication
where you have multiple nodes, thus multiple instances of connection
parameters to create).
2014-07-27 14:13:30 +02:00
Daniele Alessandri f7d8088bba Added @method tags to phpdoc header of Predis\ClientContextInterface. 2014-07-27 10:53:40 +02:00
Daniele Alessandri 38710cd69b Added Predis\ClientContextInterface.
This interface replaces Predis\ExecutableContextInterface and it is
used by client-side contexts such as pipelines or transactions.
2014-07-27 10:46:11 +02:00
Daniele Alessandri dcb57ea08d Fix method visibility in Predis\Pipeline\ConnectionErrorProof. 2014-07-25 16:44:04 +02:00
Daniele Alessandri 558e10963c Merge branch 'v1.0/refactor-cluster-internals' 2014-07-25 10:58:03 +02:00
Daniele Alessandri 14a4303a54 Apply easy micro-optimization. 2014-07-23 17:07:03 +02:00
Daniele Alessandri 7d78600506 Add phpdocs for Redis commands in Predis\ClientInterface.
This commit addresses a long-standing feature request posted in #89.
2014-07-23 16:01:11 +02:00
Daniele Alessandri 784c555b67 Minor phpdoc fix. 2014-07-23 15:33:27 +02:00
Daniele Alessandri a67d35b799 Remove useless interface Predis\BasicClientInterface. 2014-07-23 15:30:18 +02:00
Daniele Alessandri 0ee5233f4f Promote __call() method to Predis\ClientInterface. 2014-07-23 15:18:09 +02:00
Daniele Alessandri 9a05d43737 Fix read/write timeouts with PhpiredisStreamConnection.
This is a regression of commit 4db0017, using stream_socket_recvfrom()
bypasses stream wrappers thus read/write timeouts handled by PHP. The
only way to make them work again is to fetch the raw socket from the
stream resource and use socket_import_stream() which is unfortunately
a PHP 5.4+ function.
2014-07-23 12:26:33 +02:00
Daniele Alessandri 6fe56985fc Simplify implementation of Predis\Connection\Parameters.
Casting values supplied by users should be done by the consumer since
we cannot cover any possible use case anyway. It is still possible to
subclass Predis\Connection\Parameters and override the filter() method
to convert certain values if deemed necessary.
2014-07-23 11:57:23 +02:00
Daniele Alessandri fdf5894022 Make connection factory mandatory for RedisCluster constructor. 2014-07-23 11:13:09 +02:00
Daniele Alessandri 2ff8c37104 Redesign the whole internals for clustering.
This change actually had a positive impact on the design of the whole
internals for clustering which is now cleaner and easier to maintain.
It is still far from perfect, but we also have to keep performances in
consideration so we can say that we ended up with a good compromise.

Previously Predis assigned an hash to each command instance which was
computed from its key, now we changed approach and the library caches
the slot assigned to each command. This works for both our client-side
sharding cluster and the upcoming redis-cluster, but the former is the
one that needed most changes.

The PredisCluster aggregate connection now only takes an instance of
StrategyInterface, which in turn wraps the chosen distributor. After
all, in order to be able to calculate the assigned slot for a command
or key, the cluster strategy must have access to the distributor that
manages the distribution of the whole keyspace. Nothing really changes
in terms of configurability as it is still possible to decide which
distributor to use for client-side sharding, it is simply different:

  $distributor = new Predis\Cluster\Distribution\KetamaRing();
  $strategy = new Predis\Cluster\PredisStrategy($distributor);
  $cluster = new Predis\Connection\Aggregate\PredisCluster($strategy);

As for the RedisCluster aggregate connection, the only change is that
the mathematical operation of calculating the assigned slot from a key
has been completely moved inside the cluster strategy instance.

The strategy for redis-cluster does not use external distributors so
trying to StrategyInterface::getDistributor() will throw an exception.
This may change in future releases, but this is not a priority since
redis-cluster relies on a fixed, well-defined distribution mechanism.
2014-07-22 18:13:12 +02:00
Daniele Alessandri 346986099d Rename method "enableAutoSlotsMap()" to "useClusterSlots()". 2014-07-21 14:38:20 +02:00
Daniele Alessandri 9213f02da8 Fix phpdocs. 2014-07-21 14:37:29 +02:00
Daniele Alessandri 4ab2bcea64 Fetch updated slots map from node indicated by -MOVED response.
This optimization makes it possible to fetch the slots map directly
from the server indicated by the -MOVED response eliminating the need
to use a random node in the pool, which in turn could require Predis
to open a new and useless connection.
2014-07-21 14:02:48 +02:00
Daniele Alessandri 217bd69b7f Minor phpdocs fixes.
[ci skip]
2014-07-21 14:02:48 +02:00
Daniele Alessandri bd00b8cfe2 Fetch cluster slots from node upon first -MOVED response.
This is a more sane default as it allows users to indicate only a few
servers of the whole cluster composition, while it previously required
a more complex configuration of the client using client options.

This feature can be disabled using the "enableAutoSlotsMap()" method.
2014-07-21 14:02:43 +02:00
Daniele Alessandri a32eaf627b Remove useless method.
It is better to wrap explicitly a multibulk response iterator into a
multibulk tuple response iterator instead of hard-coding that into a
specialized method.
2014-07-21 11:18:25 +02:00
Daniele Alessandri e89f5cbc39 Add method to get connection factory from redis-cluster connection. 2014-07-21 11:11:52 +02:00
Daniele Alessandri 4188dc51bf Make it possible to specify a custom strategy for redis-cluster. 2014-07-21 10:56:32 +02:00
Daniele Alessandri eb8de52269 New command: COMMAND (Redis 3.0.0).
The command returns the response as is, but it would probably be not a
bad idea to parse it to restructure returned info using named arrays,
making it easier to access single commands and their info.

We will keep it as is for now, and investigate this change later.
2014-07-18 12:56:34 +02:00
Daniele Alessandri 202c558103 Run php-cs against source code. 2014-07-17 15:59:43 +02:00
Daniele Alessandri 89e662dc89 Use same strategy for both client-side sharding and redis-cluster.
This change is possible because, after a few changes in redis-cluster,
our default cluster strategy used for client side sharding and the one
used for redis-cluster turned out to be exactly the same, except for
the hashing function used to calculate distribution.

Actually some checks used to enforce correctness are redundant in the
context of redis-cluster (e.g. the one used to make sure that keys in
requests performing cross-keys operations will hash to the same slot,
which is performed by the server) so we could also add a more dumb and
permissive cluster strategy that relies on checks performed by Redis.

Differently to v0.8, the strategy for client-side sharding now uses
the same rules for extracting hash tags from keys especially when
empty tags are found in the string.
2014-07-17 12:48:46 +02:00