使用 SORT 命令从 Redis 中的排序集中获取 HASH 字段
Using SORT command to get HASH fields from a sorted set in Redis
例如,在 redis-cli
中,我尝试创建一个这样的排序集:
zadd sortedset 1 1 2 2 3 3
我创建了这样的哈希:
hset data 1 hello
hset data 2 goodbye
hset data 3 sir
我的目标是将标识符存储在已排序的集合中,并将字符串存储在 data
散列中,并按已排序的集合顺序进行排序。
这是我目前尝试过的方法:
sort sortedset by nosort get data->*
...输出:
1) (nil)
2) (nil)
3) (nil)
实际上我期待 *
通配符应该是存储在所谓的排序集中的标识符之一,但它似乎没有对排序集中的每个具体标识符执行替换。
我是在尝试以正确的方式解决问题,还是有其他方法可以解决这个问题?
基本上,您是对的,但是 SORT
命令的当前实现只接受散列取消引用左侧的通配符(参见 sort.c
中的 lookupKeyByPattern
)。这就是 atm 的方式,而不是 SORT
,使用 Lua 脚本。例如,这是一个肮脏的快速方法:
$ redis-cli eval "return redis.call('HMGET', KEYS[2], unpack(redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', '+inf')))" 2 sortedset data
1) "hello"
2) "goodbye"
3) "sir"
我发现这是一个目前 Redis 并未实际涵盖的用例。
无论如何,还有另一种方法:排序集和 hmget
的组合。
如果我将标识符存储在一个排序的集合中并且 我使用 zrange
的排名范围来获取它们,使用 hmget
给出多个哈希很容易从哈希中获取分页结果键。
例如,在 redis-cli
中,我尝试创建一个这样的排序集:
zadd sortedset 1 1 2 2 3 3
我创建了这样的哈希:
hset data 1 hello
hset data 2 goodbye
hset data 3 sir
我的目标是将标识符存储在已排序的集合中,并将字符串存储在 data
散列中,并按已排序的集合顺序进行排序。
这是我目前尝试过的方法:
sort sortedset by nosort get data->*
...输出:
1) (nil)
2) (nil)
3) (nil)
实际上我期待 *
通配符应该是存储在所谓的排序集中的标识符之一,但它似乎没有对排序集中的每个具体标识符执行替换。
我是在尝试以正确的方式解决问题,还是有其他方法可以解决这个问题?
基本上,您是对的,但是 SORT
命令的当前实现只接受散列取消引用左侧的通配符(参见 sort.c
中的 lookupKeyByPattern
)。这就是 atm 的方式,而不是 SORT
,使用 Lua 脚本。例如,这是一个肮脏的快速方法:
$ redis-cli eval "return redis.call('HMGET', KEYS[2], unpack(redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', '+inf')))" 2 sortedset data
1) "hello"
2) "goodbye"
3) "sir"
我发现这是一个目前 Redis 并未实际涵盖的用例。
无论如何,还有另一种方法:排序集和 hmget
的组合。
如果我将标识符存储在一个排序的集合中并且 我使用 zrange
的排名范围来获取它们,使用 hmget
给出多个哈希很容易从哈希中获取分页结果键。