如何使用排序集从 redis 获取多个键的值?
zadd Users 0 David
zadd Users 5 John
zadd Users 15 Linda
zrevrange Users 0 -1 withscores
这将有两个用户。
如何在一个查询中检索键为“David”和“Linda”的用户?
如何使用排序集从 redis 获取多个键的值?
zadd Users 0 David
zadd Users 5 John
zadd Users 15 Linda
zrevrange Users 0 -1 withscores
这将有两个用户。
如何在一个查询中检索键为“David”和“Linda”的用户?
您可以使用 Redis MGET
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)
有多种方法可以做到这一点,而无需在 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。
使用排序集是因为您要处理已排序的项目。您要求的是不要将排序集用作排序集。如果您不关心排序顺序,那么排序集可能不是您想要的。您已经可以检索多个键,但不能检索任意键。
如果您的主要目标是检索多个任意键,请使用散列和 hmget。如果您的主要需求是访问排序集,请使用排序集并执行脚本路径或管道一系列 zscore 调用。
你不能用一个命令得到它。您可以做的最接近的事情是在一个响应中得到它:
MULTI
ZSCORE Users David
ZSCORE Users Linda
EXEC
编辑:或者,您可以使用用户分数维护并行哈希,并使用
HMGET UserScores David Linda