在redis中使用集合中的哈希进行排序

时间:2017-11-05 11:10:18

标签: sorting hash redis set redis-cli

我们使用REPL redis-cli以这种方式在redis中创建了3个哈希:

hmset redishop:items:Articulo1 artist "Martin Wessely" price 12.99 name "Handcrafted Trees Mug" 
hmset redishop:items:Articulo2 artist "Martin Wessely" price 13.99 name "Handcrafted Trees Mug"
hmset redishop:items:Articulo3 artist "Martin Wessely" price 14.99 name "Handcrafted Trees Mug"

我检查结构是否在redis中创建好了,这些都在那里:

hgetall redishop:items:Articulo3

现在我们以这种方式在集合中添加哈希:

sadd redishop:list-all redishop:items:Articulo3
sadd redishop:list-all redishop:items:Articulo2
sadd redishop:list-all redishop:items:Articulo1

现在我们正在使用命令SORT:

SORT redishop:list-all BY redishop:items:*->price
SORT redishop:list-all BY redishop:items:*->price GET redishop:items:*->price
SORT redishop:list-all BY redishop:items:*->price GET # GET redishop:items:*->price

我们永远不会得到结果,集合中的哈希值为null,我不明白为什么?

另一方面,如果我们创建哈希并以其他方式设置:

multi
hmset redishop:items:Articulo1 artist "Martin Wessely" price 12.99 name "Handcrafted Trees Mug" 
sadd redishop:list-all Articulo1
hmset redishop:items3:Articulo2 artist "Martin Wessely" price 13.99 name "Handcrafted Trees Mug"
sadd redishop:list-all Articulo2
hmset redishop:items3:Articulo3 artist "Martin Wessely" price 14.99 name "Handcrafted Trees Mug"
sadd redishop:list-all Articulo3
exec

通过这种方式,命令SORT完美地运行并且哈希被插入到集合中,但我不明白为什么在redis文档的基础上:

  1. 命令multi only标记事务块的开头。后续命令将使用EXEC排队等待原子执行。

  2. 当我使用密钥创建哈希时:key:key如果我使用的话是无关紧要的:或者,或者 - 在redis中最重要的是我们根据文档创建结构树: https://redis.io/topics/data-types-intro

  3. 他们告诉你更好或更好的方式包括:或点,但他们不告诉你他正在创建一个结构树。然后我不明白为什么当你在集合中添加哈希时如果键入Articulo1而不是redishop:items:Articulo1是好的但是在其他情况下是错误的????事实上,当你输入hgetall Articulo1时,你会收到一个null,但当你输入hgetall redishop:items:Articulo1时,你会得到所有fels的值......这太奇怪了。

    1. exec只执行所有句子,因为这些原因应该与多个或没有多个句子相同。
    2. 请对此主题提供任何帮助或解释都会有很大帮助。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

现在我们正在使用命令SORT

谨防SORT的时间复杂度和内存要求,我通常建议不要使用它。

  

我们永远不会得到结果,集合中的哈希值为null,我不明白为什么?

问题在于您如何调用SORT并指定GET和BY子句。由于你的Set的成员是完整的(哈希)键名,所以你应该如何使用你的示例数据:

res: undefined
  

通过这种方式,命令SORT可以完美地运行

在这种情况下,您只使用键名的“id”部分填充Set,因此GET和BY子句映射到实际数据。澄清一下,这与127.0.0.1:6379> SORT redishop:list-all BY *->price 1) "redishop:items:Articulo1" 2) "redishop:items:Articulo2" 3) "redishop:items:Articulo3" 127.0.0.1:6379> SORT redishop:list-all BY *->price GET *->price 1) "12.99" 2) "13.99" 3) "14.99" 块的使用(或缺乏)无关。