v0.7.0 (2010-xx-xx)
  * Support for long aliases (method names) for Redis commands has been dropped.

  * List of the methods removed in this release:
      - Predis\Client::create()
        This method has been removed because it was considered redundant 
        with Predis\Client::__construct() since Predis 0.6.0.
      - Predis\Client::pipelineSafe()
        This method was deprecated in Predis 0.6.1 and now it has been finally 
        removed. Use Predis\Client::pipeline(array('safe' => true)).
      - Predis\Client::rawCommand()
        This method was removed due to interface inconsistencies with the 
        underlying connection class used internally by the client instance.
      - Predis\Client::setProfile()
        This method is no more part of the public API and has been made private.

  * The Predis\MultiBulkCommand class has been merged into Predis\Command and 
    thus removed. If you have code that extends Predis\MultiBulkCommand but 
    you can not afford to update your code, you can always implement it again 
    as an abstract class simply by extending Predis\Command.

  * The Predis\IConnection interface has been splitted in two different new 
    interfaces: Predis\IConnectionSingle and Predis\IConnectionCluster.

  * Developers can now register their own classes that implements the 
    Predis\IConnectionSingle interface to handle different URI schemes such as 
    'tcp', 'unix', 'udp' or anything else. Everything is handled by the new 
    Predis\ConnectionFactory class.

  * Added support for UNIX domain sockets (supported by Redis 2.2) with the new 
    Predis\UnixDomainSocketConnection class and the 'unix' scheme.

  * Added the new Predis\ICommand interface. The Predis\Command class now 
    implements this interface that is used in the core bits of Predis.

  * Implicit extraction of arguments when the only argument passed to a 
    multibulk command is an array is not supported anymore and must be done 
    explicitly inside Predis\Command::filterArguments().

  * It is now possible to pass instances of Predis\ConnectionParameters and 
    Predis\IConnection as parameters of Predis\Client::__construct().

v0.6.5 (2011-02-12)
  * FIX: due to an untested internal change introduced in v0.6.4, a wrong
    handling of bulk reads of zero-length values was producing protocol
    desynchronization errors (ISSUE #20).

v0.6.4 (2011-02-12)
  * Various performance improvements (15% ~ 25%) especially when dealing with 
    long multibulk replies or when using clustered connections.

  * Added the "on_retry" option to Predis\MultiExecBlock that can be used to 
    specify an external callback (or any callable object) that gets invoked 
    whenever a transaction is aborted by the server.

  * Added inline (p)subscribtion via options when initializing an instance of 
    Predis\PubSubContext.

v0.6.3 (2011-01-01)
  * New commands available in the Redis v2.2 profile (dev):
      - Strings: SETRANGE, GETRANGE, SETBIT, GETBIT
      - Lists  : BRPOPLPUSH

  * The abstraction for MULTI/EXEC transactions has been dramatically improved 
    by providing support for check-and-set (CAS) operations when using Redis >= 
    2.2. Aborted transactions can also be optionally replayed in automatic up 
    to a user-defined number of times, after which a Predis\AbortedMultiExec 
    exception is thrown.

v0.6.2 (2010-11-28)
  * Minor internal improvements and clean ups.

  * New commands available in the Redis v2.2 profile (dev):
      - Strings: STRLEN
      - Lists  : LINSERT, RPUSHX, LPUSHX
      - ZSets  : ZREVRANGEBYSCORE
      - Misc.  : PERSIST

  * WATCH also accepts a single array parameter with the keys that should be 
    monitored during a transaction.

  * Improved the behaviour of Predis\MultiExecBlock in certain corner cases.

  * Improved parameters checking for the SORT command.

  * FIX: the STORE parameter for the SORT command didn't work correctly when 
    using '0' as the target key (ISSUE #13).

  * FIX: the methods for UNWATCH and DISCARD do not break anymore method 
    chaining with Predis\MultiExecBlock.

v0.6.1 (2010-07-11)
  * Minor internal improvements and clean ups.

  * New commands available in the Redis v2.2 profile (dev):
      - Misc.  : WATCH, UNWATCH

  * Optional modifiers for ZRANGE, ZREVRANGE and ZRANGEBYSCORE queries are 
    supported using an associative array passed as the last argument of their 
    respective methods.

  * The LIMIT modifier for ZRANGEBYSCORE can be specified using either: 
      - an indexed array: array($offset, $count)
      - an associative array: array('offset' => $offset, 'count' => $count)

  * The method Predis\Client::__construct() now accepts also instances of 
    Predis\ConnectionParameters.

  * Predis\MultiExecBlock and Predis\PubSubContext now throw an exception 
    when trying to create their instances using a profile that does not 
    support the required Redis commands or when the client is connected to 
    a cluster of connections.

  * Various improvements to Predis\MultiExecBlock:
      - fixes and more consistent behaviour across various usage cases.
      - support for WATCH and UNWATCH when using the current development 
        profile (Redis v2.2) and aborted transactions.

  * New signature for Predis\Client::multiExec() which is now able to accept 
    an array of options for the underlying instance of Predis\MultiExecBlock. 
    Backwards compatibility with previous releases of Predis is ensured.

  * New signature for Predis\Client::pipeline() which is now able to accept 
    an array of options for the underlying instance of Predis\CommandPipeline. 
    Backwards compatibility with previous releases of Predis is ensured. 
    The method Predis\Client::pipelineSafe() is to be considered deprecated.

  * FIX: The WEIGHT modifier for ZUNIONSTORE and ZINTERSTORE was handled 
    incorrectly with more than two weights specified.

v0.6.0 (2010-05-24)
  * Switched to the new multi-bulk request protocol for all of the commands 
    in the Redis 1.2 and Redis 2.0 profiles. Inline and bulk requests are now 
    deprecated as they will be removed in future releases of Redis.

  * The default server profile is "2.0" (targeting Redis 2.0.x). If you are 
    using older versions of Redis, it is highly recommended that you specify 
    which server profile the client should use (e.g. "1.2" when connecting 
    to instances of Redis 1.2.x).

  * Support for Redis 1.0 is now optional and it is provided by requiring 
    'Predis_Compatibility.php' before creating an instance of Predis\Client.

  * New commands added to the Redis 2.0 profile since Predis 0.5.1:
      - Strings: SETEX, APPEND, SUBSTR
      - ZSets  : ZCOUNT, ZRANK, ZUNIONSTORE, ZINTERSTORE, ZREMBYRANK, ZREVRANK
      - Hashes : HSET, HSETNX, HMSET, HINCRBY, HGET, HMGET, HDEL, HEXISTS, 
                 HLEN, HKEYS, HVALS, HGETALL
      - PubSub : PUBLISH, SUBSCRIBE, UNSUBSCRIBE
      - Misc.  : DISCARD, CONFIG

  * Introduced client-level options with the new Predis\ClientOptions class. 
    Options can be passed to Predis\Client::__construct in its second argument 
    as an array or an instance of Predis\ClientOptions. For brevity's sake and 
    compatibility with older versions, the constructor of Predis\Client still 
    accepts an instance of Predis\RedisServerProfile in its second argument.
    The currently supported client options are:
      - profile [default: "2.0" as of Predis 0.6.0]
        specifies which server profile to use when connecting to Redis. This 
        option accepts an instance of Predis\RedisServerProfile or a string 
        that indicates the target version.
      - key_distribution [default: Predis\Distribution\HashRing]
        specifies which key distribution strategy to use to distribute keys 
        among the servers that compose a cluster. This option accepts an 
        instance of Predis\Distribution\IDistributionStrategy so that users 
        can implement their own key distribution strategy. Optionally, the new 
        Predis\Distribution\KetamaPureRing class also provides a pure-PHP 
        implementation of the same algorithm used by libketama.
      - throw_on_error [default: TRUE]
        server errors can optionally be handled "silently": instead of throwing 
        an exception, the client returns an error response type.
      - iterable_multibulk [EXPERIMENTAL - default: FALSE]
        in addition to the classic way of fetching a whole multibulk reply 
        into an array, the client can now optionally stream a multibulk reply 
        down to the user code by using PHP iterators. It is just a little bit 
        slower, but it can save a lot of memory in certain scenarios.

  * New parameters for connections: 
      - alias [default: not set]
        every connection can now be identified by an alias that is useful to 
        get a certain connection when connected to a cluster of Redis servers.
      - weight [default: not set]
        allows the client to balance the keys asymmetrically across multiple 
        servers. This might be useful when you have servers with different 
        amounts of memory and you want to distribute the load of your keys 
        accordingly.
      - connection_async [default: FALSE]
        estabilish connections to servers in a non-blocking way, so that the 
        client is not blocked while the underlying resource performs the actual 
        connection.
      - connection_persistent [default: FALSE]
        the underlying connection resource is left open when a script ends its 
        lifecycle. Persistent connections can lead to unpredictable or strange 
        behaviours, so they should be used with extreme care.

  * Introduced the Predis\Pipeline\IPipelineExecutor interface. Classes that 
    implements this interface are used internally by the Predis\CommandPipeline 
    class to change the behaviour of the pipeline when writing/reading commands 
    from one or multiple servers. Here is the list of the default executors:
      - Predis\Pipeline\StandardExecutor
        Exceptions generated by server errors might be thrown depending on the 
        options passed to the client (see "throw_on_error"). Instead, protocol 
        or network errors always throw exceptions. This is the default executor 
        for single and clustered connections and shares the same behaviour of 
        Predis 0.5.x.
      - Predis\Pipeline\SafeExecutor
        Exceptions generated by server, protocol or network errors are not 
        thrown, instead they are returned in the response array as instances of 
        ResponseError or CommunicationException.
      - Predis\Pipeline\SafeClusterExecutor
        This executor shares the same behaviour of Predis\Pipeline\SafeExecutor 
        but it is geared towards clustered connections.

  * Support for PUBSUB is handled by the new Predis\PubSubContext class, which 
    could also be used to build a callback dispatcher for PUBSUB scenarios.

  * When connected to a cluster of connections, it is now possible to get a 
    new Predis\Client instance for a single connection of the cluster by 
    passing its alias/index to the new Predis\Client::getClientFor() method.

  * CommandPipeline and MultiExecBlock return their instances when invoking 
    commands, thus allowing method chaining in pipelines and multi-exec blocks.

  * MultiExecBlock instances can handle the new DISCARD command.

  * Connections now support float values for the connection_timeout parameter 
    to express timeouts with a microsecond resolution.

  * FIX: TCP connections now respect the read/write timeout parameter when 
    reading the payload of server responses. Previously, stream_get_contents() 
    was being used internally to read data from a connection but it looks like 
    PHP does not honour the specified timeout for socket streams when inside 
    this function.

  * FIX: The GET parameter for the SORT command now accepts also multiple key 
    patterns by passing an array of strings. (ISSUE #1).

  * FIX: Replies to the DEL command return the number of elements deleted by 
    the server and not 0 or 1 interpreted as a boolean response. (ISSUE #4).

v0.5.1 (2010-01-23)
  * RPOPLPUSH has been changed from bulk command to inline command in Redis
    1.2.1, so ListPopLastPushHead now extends InlineCommand. The old RPOPLPUSH
    behavior is still available via the ListPopLastPushHeadBulk class so that
    you can override the server profile if you need the old (and uncorrect)
    behaviour when connecting to a Redis 1.2.0 instance.

  * Added missing support for BGREWRITEAOF for Redis >= 1.2.0

  * Implemented a factory method for the RedisServerProfile class to ease the 
    creation of new server profile instances based on a version string.

v0.5.0 (2010-01-09)
  * First versioned release of Predis
