musdy
musdy

Reputation: 541

REDIS - Get value of multiple keys

How do I get the value of multiple keys from redis using a sorted set?

zadd Users 0 David
zadd Users 5 John
zadd Users 15 Linda
zrevrange Users 0 -1 withscores

This will have two users in it.

How can I retrieve the users with key 'David' and 'Linda' in one query?

Upvotes: 21

Views: 70298

Answers (4)

Hemant_Negi
Hemant_Negi

Reputation: 2078

You can use Redis MGET

redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)

More here http://redis.io/commands/mget

Upvotes: 34

The Real Bill
The Real Bill

Reputation: 15793

One uses a sorted set because you want to deal with items that are sorted. What you are asking for is to not use a sorted set as a sorted set. If you don't care about sort order, then perhaps a sorted set is not what you are looking for. You already can retrieve multiple keys, but not arbitrary ones.

If your primary goal is to retrieve multiple arbitrary keys, use a hash and hmget. If your primary need is to access a sorted set, use sorted set and either go the scripting route or pipeline a series of zscore calls.

Upvotes: 1

Didier Spezia
Didier Spezia

Reputation: 73306

There are multiple ways to do it without introducing a new command in Redis.

For instance, you can fill a temporary set with the names you are interested in, then calculate the intersection between the temporary set and the zset:

multi
  sadd tmp David Linda ... and more ...
  zinterstore res 2 tmp Users weights 0 1
  zrange res 0 -1 withscores
  del tmp res
exec

With pipelining, this will only generate one roundtrip and you can fill an arbitrary number of input parameters in tmp.

With Redis 2.6, you can also wrap these lines into a server-side Lua script to finally get a command accepting an input list and returning the result you want:

eval "redis.call( 'sadd', 'tmp', unpack(KEYS) );
      redis.call( 'zinterstore', 'res', 2, 'tmp', 'Users', 'weights', 0, 1 );
      local res = redis.call( 'zrange', 'res', 0, -1, 'withscores' );
      redis.call( 'del', 'res', 'tmp' ) ; 
      return res
     " 2 David Linda

You can safely assume no new command will be added to Redis if it can easily been implemented using scripting.

Upvotes: 12

ziad-saab
ziad-saab

Reputation: 20269

You cannot get this with one command. The closest you can do to get it in one response:

MULTI
ZSCORE Users David
ZSCORE Users Linda
EXEC

EDIT: Alternatively, you can maintain a parallel hash with users' scores, and query it with

HMGET UserScores David Linda

Upvotes: 0

Related Questions