【问题标题】:Using SORT command to get HASH fields from a sorted set in Redis使用 SORT 命令从 Redis 中的排序集中获取 HASH 字段
【发布时间】:2015-05-21 09:38:28
【问题描述】:

例如,在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)

实际上,我期望* 通配符应该是存储在所谓的排序集中的标识符之一,但似乎它不会对排序集中的每个具体标识符执行替换。

我是在尝试以正确的方式解决问题,还是有其他方法可以解决这个问题?

【问题讨论】:

    标签: sorting redis hashmap sortedset


    【解决方案1】:

    基本上,您是对的,但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"
    

    【讨论】:

    • 我最终通过将排序集给出的分页 ID 提供给 hmget 来获取多个哈希键
    • 好吧,也许 Lua 在某些情况下有点过头了。就我而言,我使用的是 C# 和 StackExchange.Redis,但你的方法很好!
    • 很好的解决方案 - 它的好处是可以以多次调用为代价减少 RAM 的穷举
    • 回复。 Lua 过度杀伤与 SORT - 我不确定您是否会看到性能上的重大差异,即使后者按照您的预期实施。 SORT 可以说是 Redis 中最复杂的命令 :)
    • 无论如何,好问题 - 让我从**中抽出头来,阅读源代码并报告问题 (github.com/antirez/redis/issues/2588) :)
    【解决方案2】:

    我发现这是一个 Redis 目前实际上并未涵盖的用例。

    无论如何,还有另一种方法:将排序集和hmget 结合起来。

    如果我将标识符存储在一个排序集中并且我使用带有zrange 的排名范围来获取它们,那么使用hmget 提供多个散列键很容易从散列中获取分页结果。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2017-04-29
      • 2017-10-12
      相关资源
      最近更新 更多