Finally we are already at the end of another development cycle: the first release candidate of Redis 2.2.0 is out! You can grab it here from github
, it is tagged as 2.2.0-rc1
, or if you prefer, as a tar.gz file
As I said some time ago, 2.2 is a monument to how much Redis 2.0 sucked. I think that looking back to the previous version and having the feeling of a very bad implementation is a good thing. It means we did another step improving our code.
On the other side, Redis 2.2 works as a drop in replacement for 2.0, as 2.0 is more or less a strict subset of Redis 2.2. This was not a goal, so I guess that while we improved a lot our implementation, we got the API right already in 2.0 :) No big change was necessary at all.
The following is a list of all the improvements, at least the biggest ones. In the next weeks I'll blog here about every single feature. There are too much things that the users needs to discover to really make the most out of Redis 2.2. Redis is still a simple product, but at the same time the simple primitives can be used in a very powerful ways. This is the case of the GETBIT/SETBIT commands in 2.2, that together with SETRANGE and GETRANGE turned Redis strings into powerful random access, memory saving, arrays.
But I'll blog about this features in the next days. For now, here is the big list :)
- Specially encoded data types, small lists and sets can now use up to an order of magnitude less memory.
- VM partial rewrite for code cleaness and memory usage.* Change to the implementation of the top level dictionary for better memory efficienty.
- redis-cli is hugely improved: tab completion, inline help (Thanks to TJ Holowaychuk), raw output, rewritten using the new hiredis C library.
- Networking internals rewritten for efficiency. You can expect LRANGE and similar commands to be at least 10 times faster.
- Most read only commands are now copy-on-write friendly, this means that Redis will use little memory when a saving child is active and the parent process is mostly stressed by read queries.
- Non blocking replication even from the point of view of the slave, with configurable behavior about what to do when the link is disconnected. You can select if serving old data or replying with an error.
- Check-and-set (CAS) transactions with the new WATCH command.* Now write operations work against keys with an EXPIRE set! Imagine the possibilities.
- New maxmemory eviction policies. It is possible to select among LRU, farest TTL expire, and other algorithms, and if when the memory limit is reached only keys with an expire set or all the keys should be expired.
- SETBIT / GETBIT / SETRANGE / GETRANGE / STRLEN. Now your strings are your arrays!* Syslog support (Thanks to Jonah H. Harris)
- Unix domain socket support.
- New List related functions LINSERT, LPUSHX, RPUSHX (Thanks to Robey Pointer)
- BRPOPLPUSH (Thanks to Michel Martens and Damian Janowski)
- Much more interesting informations in the INFO output.
- Sorted sets are now less memory hungry.
- Non blocking loading of .rdb / AOF file on startup, with progress information in the INFO output.
- Now Redis has a clean, powerful, supported C library: hiredis.
- Code layout completely new, the 2.0.x huge redis.c file is now splitted in many parts.
- Redis-benchmark rewritten to be faster and in order to use hiredis as well.
- Endless other CPU optimizations and bugs fixed.
Where not specified the implementation and design were done by me and Pieter Noordhuis. I can't say thanks enough times to Pieter for his awesome work. Thanks to VMware for making all this possible. Also many thanks to all the other contributors and the amazing community we have.
When I read the twitter search stream for the Redis keyword, many times I see the word "fun" related to using Redis. There is nothing better then reading this for me, I really think that programming should be fun. Databases used to be useful but boring in the past. It's cool to see the tendency is changing (well I don't want to imply they are getting useless!) ;)
So... the best way to end this post is to say: Have fun!