For the past 2 years I’ve been all about Redis, and something I’m continually excited about is
It is a sorted set implementation built into Redis. Its super fast, flexible, and I use it all the time, probably sometimes just because its fun.
I’ll show how it works, and outline two situations I’ve found it to be especially effective.
The simplest operation is to set a value for a given key. Imagine we want to record ages in a sorted set:
redis 127.0.0.1:6379> ZADD "ages" 25 "john" (integer) 1 redis 127.0.0.1:6379> ZADD "ages" 30 "joe" (integer) 1
Once they’re in, we can query them in order. To get the entries out, ordered by their rank:
redis 127.0.0.1:6379> ZRANGE 'ages' 0 1 1) "john" 2) "joe"
It may be useful to see them in the reverse order (highest to lowest):
redis 127.0.0.1:6379> ZREVRANGE 'ages' 0 1 1) "joe" 2) "john"
Or to have their scores returned alongisde them:
redis 127.0.0.1:6379> ZREVRANGE 'ages' 0 1 WITHSCORES 1) "joe" 2) "30" 3) "john" 4) "25"
You can also do these ranges by score (
ZRANGEBYSCORE), increment members (
ZINCRBY), remove ranges (
ZREMRANGEBYRANK), or just query for scores (
The cool part about this, is that these operations are so simple, that you can use them as persisted copies of data structures, that can exist between multiple services, or multiple hosts/nodes. In fact, that’s exactly what projects like redis-objects exist to make easy.
This is probably the first thing most people think of with the sorted set. When something happens, we can bump up the value of a given key by a certain value and then query for the top values (or lowest values) easily using
ZINCRBY, and efficiently.
Another use I come into pretty often is to make the values UNIX timestamps, and put data in the keys. With the set you can easily query for date ranges, get get the oldest and most recent entries, and easily purge ranges of results when they’re no longer relevant (by date using
ZREMRANGEBYSCORE, or by limit with
What’s your favorite use of
One thing that’s really neat about the redis documentation is that they describe the runtime of each method right at the top. Check out the ZSET documentation for more details!