11

如何使用排序集从 redis 获取多个键的值?

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

这将有两个用户。

如何在一个查询中检索键为“David”和“Linda”的用户?

4

4 回答 4

21

您可以使用 Redis MGET

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

更多在这里 http://redis.io/commands/mget

于 2014-11-14T13:38:20.353 回答
11

有多种方法可以做到这一点,而无需在 Redis 中引入新命令。

例如,您可以用您感兴趣的名称填充一个临时集,然后计算临时集和 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

使用流水线,这只会生成一次往返,您可以在 tmp.xml 中填充任意数量的输入参数。

使用 Redis 2.6,您还可以将这些行包装到服务器端 Lua 脚本中,以最终获得接受输入列表并返回所需结果的命令:

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

如果可以使用脚本轻松实现,您可以放心地假设不会将新命令添加到 Redis。

于 2012-05-30T13:30:14.947 回答
1

使用排序集是因为您要处理已排序的项目。您要求的是不要将排序集用作排序集。如果您不关心排序顺序,那么排序集可能不是您想要的。您已经可以检索多个键,但不能检索任意键。

如果您的主要目标是检索多个任意键,请使用散列和 hmget。如果您的主要需求是访问排序集,请使用排序集并执行脚本路径或管道一系列 zscore 调用。

于 2012-05-31T05:09:38.510 回答
0

你不能用一个命令得到它。您可以做的最接近的事情是在一个响应中得到它:

MULTI
ZSCORE Users David
ZSCORE Users Linda
EXEC

编辑:或者,您可以使用用户分数维护并行哈希,并使用

HMGET UserScores David Linda
于 2012-05-30T11:00:28.450 回答