Commit Graph

1275 Commits

Author SHA1 Message Date
Daniele Alessandri 72e9187662 More README tweaks.
[ci skip]
2013-12-09 11:53:58 +01:00
Daniele Alessandri 98410bbcaa Pad headers lines in CHANGELOG.
[ci skip]
2013-12-09 11:47:57 +01:00
Daniele Alessandri 5ea1d6fe92 Backport rewrite of README from master (v0.9) with necessary changes.
[ci skip]
2013-12-09 11:42:09 +01:00
Daniele Alessandri 73780da52d Backport improvements for redis-cluster from master (v0.9).
List of changes:

  - The cluster connection sends an ASKING command before retrying
    a command on a different node when Redis returns a -ASK response.
  - The cluster connection can be initialized with a partial list of
    nodes, the full slots map will be fetched from Redis itself using
    the CLUSTER NODES command.
  - The slots map can be optionally retrieved from Redis if the server
    returns a -MOVE response, otherwise only the interested slot will
    be permanently reassigned to the new target node.
  - It is possible to specify a set of common parameters applied to
    connections created on the fly when not part of the current pool
    upon -MOVE and -ASK responses returned by Redis for redirections.
  - $cluster->connect() connects to a random connection in the pool
    instead of forcing the connect operation on all the connections.
2013-12-08 15:57:15 +01:00
Daniele Alessandri 381023ad8f Make sure raw commands IDs are normalized to uppercase. 2013-12-02 11:44:40 +01:00
Daniele Alessandri c3c819cc9c [tests] Minor tweak for timeouts. 2013-12-02 11:44:37 +01:00
Daniele Alessandri 987f27556f Merge branch 'backport/test-suite-enhancements' into v0.8 2013-12-01 15:21:05 +01:00
Daniele Alessandri a9b42924e5 [tests] Improve the basic framework of our test suite.
We now have a base test case class for Predis (namely PredisTestCase)
grouping various commonly used utility methods shared by all of the
tests in the suite, greatly improving reusability.

NOTE: Backported from v0.9-dev.
2013-12-01 15:19:51 +01:00
Daniele Alessandri e4e2238f34 Merge branch 'backport/tests-command-constraint' into v0.8 2013-12-01 14:06:31 +01:00
Daniele Alessandri e1f6c8644f [tests] Normalize casing of command identifiers in constraint.
We do not care much about the casing of command IDs in our constraint,
so it makes no difference for use if it is "SET" or "set".
2013-12-01 14:01:37 +01:00
Daniele Alessandri d16a1c8705 [tests] Add a PHPUnit constraint to verify commands.
Commands are verified by checking their IDs and optionally arguments.
Passing a command instance is only a shortcut to set the expected ID
and arguments, commands are never compared for identity but always for
equivalence.
2013-12-01 13:59:27 +01:00
Daniele Alessandri 32aff28ef5 [tests] Fix stupid change. 2013-11-30 14:58:00 +01:00
Daniele Alessandri eb906bb29c Update CHANGELOG.
[ci skip]
2013-11-30 14:53:08 +01:00
Daniele Alessandri 33ef043b8e [tests] Update tests for Predis\Command\AbstractCommand. 2013-11-30 14:48:26 +01:00
Daniele Alessandri 973c9a7031 Add new command class useful to execute "raw" Redis commands.
By raw we mean that input arguments are not filtered and responses are
not parsed, which means arguments must follow the command signature as
defined by Redis and complex responses are left untouched.

When instantiating an instance of `Predis\Command\RawCommand` you must
pass at least the command ID. You can pass further arguments in the
array or you can just set them later with `RawCommand::setArguments()`
but you cannot modify the command ID once instantiated.

  $command = new Predis\Command\RawCommand(['SET', 'foo', 'bar']);
  $response = $client->executeCommand($command);

While higher level abstractions built upon `Predis\Client` should just
use commands created by the profile in use, inner parts of the library
might use raw commands to provide certain functionalities making sure
that input and output of commands are always consistent, independent
of the profile.

NOTE: Backported from v0.9.
2013-11-30 14:37:15 +01:00
Daniele Alessandri db55fae961 Fix phpdoc.
[ci skip]
2013-11-30 14:17:59 +01:00
Daniele Alessandri 5192005862 [tests] Fix tests on PHP 5.3.
Stupid PHP 5.3.
2013-11-29 23:41:05 +01:00
Daniele Alessandri cdc6075b01 [tests] Improve tests of TTL. 2013-11-29 23:33:17 +01:00
Daniele Alessandri 623d1cc1a2 [tests] Improve base command test case. 2013-11-29 23:28:23 +01:00
Daniele Alessandri d53069f096 [tests] Add missing tests for SETNX.
For some obscure reason Predis/Command/StringSetPreserve had no tests.
2013-11-29 22:53:20 +01:00
Daniele Alessandri 8565a42605 [tests] Add "count" argument to SRANDMEMBER (since Redis >= 2.6). 2013-11-29 22:46:32 +01:00
Daniele Alessandri aac811f897 Fix phpdoc.
[ci skip]
2013-11-29 11:14:14 +01:00
Daniele Alessandri 4e664c6c90 Address #133 by reusing our own methods.
The main reason behind that code duplication was performance related
as we tried to reduce method calls when possible, even at the cost of
falling into the realm of early optimizations. Apparently we just lose
~400 req/sec on a 21000 req/sec basis ("SET foo bar") using PHP 5.5.3
(packaged by Ubuntu 13.10) on an Intel Q6600, so we will most likely
stick with this change for the sake of best practices.

Backported from v0.9-dev.
2013-11-22 15:17:50 +01:00
Daniele Alessandri b1a51b2ef9 Update CHANGELOG. 2013-11-09 20:00:33 +01:00
Daniele Alessandri de02c81398 Deprecate Predis\Client::multiExec().
This method will be replaced by Predis\Client::transaction() in the
next major release of Predis.
2013-11-09 20:00:29 +01:00
Daniele Alessandri 62f8730f1a Merge branch 'feature/list-iterator' into v0.8 2013-11-07 18:48:53 +01:00
Daniele Alessandri 9b8b362747 Implement PHP iterator for lists based on the LRANGE command.
This iterator tries to mimic the same behaviour of the cursor-based
iterators implemented upon the SCAN family of commands and offering
only limited guarantees on the returned elements, but uses LRANGE to
fetch items from a list incrementally.
2013-11-07 18:47:58 +01:00
Daniele Alessandri ee9e09aa07 Rename protected member. 2013-11-07 14:45:09 +01:00
Daniele Alessandri 66f98186f0 [tests] Do not check exception message for connection timeouts.
Given the IP address we use for this test (the standard IP assigned by
operating systems when unable to get one lease from a DHCP server), on
certain kernels or network stacks we can get different messages such
as "No route to host". Since we just need to make sure that our test
does not take more than 1 seconds abiding by the sub-second timeout,
we can just live with that.
2013-11-07 12:19:23 +01:00
Daniele Alessandri 463f2d655c Merge branch 'feature/scan-iterators' into v0.8 2013-11-07 12:10:43 +01:00
Daniele Alessandri b2db97d983 Tweak phpdocs for the abstract cursor-based iterator. 2013-11-07 12:10:04 +01:00
Daniele Alessandri 9da1648145 Mostly useless tweak for iterators example. 2013-11-07 12:10:04 +01:00
Daniele Alessandri 5ad00774e1 Rename for the last time all the iterator classes.
We are experimenting with a new approach at naming classes using less
redundant names by leveraging the containing namespace. The PHP "use"
directive is not limited to class names but can be used to import the
whole namespace, which means you can do something like this:

  use Predis\Collection\Iterator;
  // ...
  foreach (new Iterator\Keyspace($client) as $key) {
  	// ...
  }

Alternatively you can always rely on "use ... as ..." to import one of
the classes by giving it a more meaningful name in the context of the
root namespace:

  use Predis\Collection\Iterator\Keyspace as KeyspaceIterator;
  // ...
  foreach (new KeyspaceIterator($client) as $key) {
  	// ...
  }

In this specific case we chose to apply the -Key postfix to classes
iterating Redis keys to be more explicit about the fact that those
iterators does not work on local in-memory collections, but fetch
items from a key stored on a remote Redis server.
2013-11-07 12:09:59 +01:00
Daniele Alessandri ff004aeaaa Reenable skipped tests since bug in Redis has been fixed.
See commit antirez/redis@54a5a7dff8
2013-11-06 16:40:36 +01:00
Daniele Alessandri df2c9eb7ff Move Redis collections iterators in a different namespace.
The base iterator class is now known as RedisCollectionIterator and
we've also renamed a few methods to make their naming more generic.
2013-11-06 16:19:12 +01:00
Daniele Alessandri 4d8348158f [tests] Add more tests for SCAN-based iterators. 2013-11-04 18:01:29 +01:00
Daniele Alessandri 0ab0aa14fb [tests] Fix execution order of iterator methods.
We were testing iterators following a broken assumption about the
order in which the Zend engine executes the various methods during
the iteration.
2013-11-04 17:39:27 +01:00
Daniele Alessandri 85c978fdad Fix SCAN-based iterators following failing tests. 2013-11-04 16:53:56 +01:00
Daniele Alessandri b7f411a252 [ŧests] Add tests for new SCAN, SSCAN, ZSCAN and HSCAN iterators.
Right now we don't have integration tests since the returned values from
Redis may not always be predictable, but the current tests should suffice.
2013-11-04 16:53:24 +01:00
Daniele Alessandri 9866500ad6 Add example of iterators based on the various SCAN commands. 2013-11-03 15:05:05 +01:00
Daniele Alessandri 73ee5aabad Update CHANGELOG and README. 2013-11-03 14:21:31 +01:00
Daniele Alessandri e88938cdfd Implement PHP iterator based on the HSCAN command (Redis 2.8).
This iterator allows to perform full iterations over fields and values of a
hash by wrapping the incremental nature of HSCAN just like we did for SCAN:

  $client = new Predis\Client('tcp://127.0.0.1', ['profile' => '2.8']);
  $iterator = new Predis\Iterator\Scan\HashIterator($client, "hash_key");

  foreach ($iterator as $field => $value) {
      echo "$field => $value" . PHP_EOL;
  }

Being HSCAN closely related to SCAN, it is subject to the same behaviour,
see http://redis.io/commands/scan for reference.
2013-11-03 14:19:12 +01:00
Daniele Alessandri 93ae376618 Implement PHP iterator based on the ZSCAN command (Redis 2.8).
This iterator allows to perform full iterations over the members of a sorted
set by wrapping the incremental nature of ZSCAN just like we did for SCAN:

  $client = new Predis\Client('tcp://127.0.0.1', ['profile' => '2.8']);
  $iterator = new Predis\Iterator\Scan\SortedSetIterator($client, "zset_key");

  foreach ($iterator as $member => $rank) {
      echo "$rank => $member" . PHP_EOL;
  }

Being ZSCAN closely related to SCAN, it is subject to the same behaviour,
see http://redis.io/commands/scan for reference.

This iterator implementation returns the member as key and the rank as value
since the rank is a float value which would be truncated when transforming
the iteration to an array (e.g. using iterator_to_array()). Luckily PHP
preserves the insertion order for named arrays members still result sorted.
2013-11-03 14:19:07 +01:00
Daniele Alessandri 7028082b7f Implement PHP iterator based on the SSCAN command (Redis 2.8).
This iterator allows to perform full iterations over the members of a set
by wrapping the incremental nature of SSCAN just like we did for SCAN:

  $client = new Predis\Client('tcp://127.0.0.1', ['profile' => '2.8']);
  $iterator = new Predis\Iterator\Scan\SetIterator($client, "set_key");

  foreach ($iterator as $member) {
      echo $member . PHP_EOL;
  }

Being SSCAN closely related to SCAN, it is subject to the same behaviour,
see http://redis.io/commands/scan for reference.

Meh
2013-11-03 14:19:06 +01:00
Daniele Alessandri d09d8edc7d Extract base class for iterators based on the SCAN family of commands.
The iterators based on SCAN, SSCAN, ZSCAN and HSCAN will extend this abstract
class to share most of the logic which is common for all of the Redis commands
in the SCAN family.
2013-11-03 14:19:02 +01:00
Daniele Alessandri 70e42f8fca Implement PHP iterator based on the SCAN command (Redis 2.8).
This iterator allows to perform full iterations over the keyspace of a Redis
instance by wrapping the incremental nature of SCAN using an abstraction that
fits perfectly in userland code:

  $client = new Predis\Client('tcp://127.0.0.1', ['profile' => '2.8']);
  $iterator = new Predis\Iterator\Scan\KeyspaceIterator($client);

  foreach ($iterator as $key) {
      echo $key . PHP_EOL;
  }

Memory consumption during an iteration is limited because elements are fetched
incrementally, on the other hand SCAN gives limited guarantees about returned
elements since the underlying collection (the keyspace in this case) can change
during the whole iteration process. The most immediate drawback is that the same
element may be returned multiple times.

See http://redis.io/commands/scan to fully understand the inner workings,
and particularly the "Scan guarantees" paragraph.
2013-11-03 14:06:50 +01:00
Daniele Alessandri 695b6dd7b3 Update README. 2013-11-02 18:52:43 +01:00
Daniele Alessandri 6ce09a2a8b [tests] Handle failing test on OS X. 2013-11-02 18:50:24 +01:00
Daniele Alessandri bb03602326 Update CHANGELOG. 2013-11-02 18:19:32 +01:00
Daniele Alessandri 5c9adbacd7 [tests] Minor tweaks, no actual changes. 2013-11-02 18:19:32 +01:00