v0.6.6 (2011-04-01) * Switched to Redis 2.2 as the default server profile (there are no changes that would break compatibility with previous releases). Long command names are no more supported by default but if you need them you can still require Predis_Compatibility.php to avoid breaking compatibility. * Added a VERSION constant to Predis\Client. * Some performance improvements for multibulk replies (parsing them is about 16% faster than the previous version). A few core classes have been heavily optimized to reduce overhead when creating new instances. * Predis now uses by default a new protocol reader, more lightweight and faster than the default handler-based one. Users can revert to the old protocol reader with the 'reader' client option set to 'composable'. This client option can also accept custom reader classes implementing the new Predis\IResponseReader interface. * Added support for connecting to Redis using UNIX domain sockets (ISSUE #25). * The "read_write_timeout" connection parameter can now be set to 0 or false to disable read and write timeouts on connections. The old behaviour of -1 is still intact. * ZUNIONSTORE and ZINTERSTORE can accept an array to specify a list of the source keys to be used to populate the destination key. * MGET, SINTER, SUNION and SDIFF can accept an array to specify the list of keys. SINTERSTORE, SUNIONSTORE and SDIFFSTORE can also accept an array to specify the list of source keys. * SUBSCRIBE and PSUBSCRIBE can accept a list of channels for subscription. * FIX: some client-side clean-ups for MULTI/EXEC were handled incorrectly in a couple of corner cases. See also ISSUE #27. 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