* Fixed a bug with the bytearray support introduced in 2.10.2. Thanks
Josh Owen.
* 2.10.2
* Added support for Hiredis's new bytearray support. Thanks
https://github.com/tzickel
* POSSIBLE BACKWARDS INCOMPATBLE CHANGE: Fixed a possible race condition
when multiple threads share the same Lock instance with a timeout. Lock
tokens are now stored in thread local storage by default. If you have
code that acquires a lock in one thread and passes that lock instance to
another thread to release it, you need to disable thread local storage.
Refer to the doc strings on the Lock class about the thread_local
argument information.
* Fixed a regression in from_url where "charset" and "errors" weren't
valid options. "encoding" and "encoding_errors" are still accepted
and preferred.
* The "charset" and "errors" options have been deprecated. Passing
either to StrictRedis.__init__ or from_url will still work but will
also emit a DeprecationWarning. Instead use the "encoding" and
"encoding_errors" options.
* Fixed a compatability bug with Python 3 when the server closes a
connection.
* Added BITPOS command. Thanks https://github.com/jettify.
* Fixed a bug when attempting to send large values to Redis in a Pipeline.
* 2.10.1
* Fixed a bug where Sentinel connections to a server that's no longer a
master and receives a READONLY error will disconnect and reconnect to
the master.
* 2.10.0
* Discontinuted support for Python 2.5. Upgrade. You'll be happier.
* The HiRedis parser will now properly raise ConnectionErrors.
* Completely refactored PubSub support. Fixes all known PubSub bugs and
adds a bunch of new features. Docs can be found in the README under the
new "Publish / Subscribe" section.
* Added the new HyperLogLog commanads (PFADD, PFCOUNT, PFMERGE). Thanks
Pepijn de Vos and Vincent Ohprecio.
* Updated TTL and PTTL commands with Redis 2.8+ semantics. Thanks Markus
Kaiserswerth.
* *SCAN commands now return a long (int on Python3) cursor value rather
than the string representation. This might be slightly backwards
incompatible in code using *SCAN commands loops such as
"while cursor != '0':".
* Added extra *SCAN commands that return iterators instead of the normal
[cursor, data] type. Use scan_iter, hscan_iter, sscan_iter, and
zscan_iter for iterators. Thanks Mathieu Longtin.
* Added support for SLOWLOG commands. Thanks Rick van Hattem.
* Added lexicographical commands ZRANGEBYLEX, ZREMRANGEBYLEX, and ZLEXCOUNT
for sorted sets.
* Connection objects now support an optional argument, socket_read_size,
indicating how much data to read during each socket.recv() call. After
benchmarking, increased the default size to 64k, which dramatically
improves performance when fetching large values, such as many results
in a pipeline or a large (>1MB) string value.
* Improved the pack_command and send_packed_command functions to increase
performance when sending large (>1MB) values.
* Sentinel Connections to master servers now detect when a READONLY error
is encountered and disconnect themselves and all other active connections
to the same master so that the new master can be discovered.
* Fixed Sentinel state parsing on Python 3.
* Added support for SENTINEL MONITOR, SENTINEL REMOVE, and SENTINEL SET
commands. Thanks Greg Murphy.
* INFO ouput that doesn't follow the "key:value" format will now be
appended to a key named "__raw__" in the INFO dictionary. Thanks Pedro
Larroy.
* The "vagrant" directory contains a complete vagrant environment for
redis-py developers. The environment runs a Redis master, a Redis slave,
and 3 Sentinels. Future iterations of the test sutie will incorporate
more integration style tests, ensuring things like failover happen
correctly.
* It's now possible to create connection pool instances from a URL.
StrictRedis.from_url() now uses this feature to create a connection pool
instance and use that when creating a new client instance. Thanks
https://github.com/chillipino
* When creating client instances or connection pool instances from an URL,
it's now possible to pass additional options to the connection pool with
querystring arguments.
* Fixed a bug where some encodings (like utf-16) were unusable on Python 3
as command names and literals would get encoded.
* Added an SSLConnection class that allows for secure connections through
stunnel or other means. Construct and SSL connection with the sll=True
option on client classes, using the rediss:// scheme from an URL, or
by passing the SSLConnection class to a connection pool's
connection_class argument. Thanks https://github.com/oranagra.
* Added a socket_connect_timeout option to control how long to wait while
establishing a TCP connection before timing out. This lets the client
fail fast when attempting to connect to a downed server while keeping
a more lenient timeout for all other socket operations.
* Added TCP Keep-alive support by passing use the socket_keepalive=True
option. Finer grain control can be achieved using the
socket_keepalive_options option which expects a dictionary with any of
the keys (socket.TCP_KEEPIDLE, socket.TCP_KEEPCNT, socket.TCP_KEEPINTVL)
and integers for values. Thanks Yossi Gottlieb.
* Added a `retry_on_timeout` option that controls how socket.timeout errors
are handled. By default it is set to False and will cause the client to
raise a TimeoutError anytime a socket.timeout is encountered. If
`retry_on_timeout` is set to True, the client will retry a command that
timed out once like other `socket.error`s.
* Completely refactored the Lock system. There is now a LuaLock class
that's used when the Redis server is capable of running Lua scripts along
with a fallback class for Redis servers < 2.6. The new locks fix several
subtle race consider that the old lock could face. In additional, a
new method, "extend" is available on lock instances that all a lock
owner to extend the amount of time they have the lock for. Thanks to
Eli Finkelshteyn and https://github.com/chillipino for contributions.