【问题标题】:sort set in redis with hash in the collectionredis中的排序集与集合中的哈希
【发布时间】:2017-11-05 11:10:17
【问题描述】:

我们以这种方式使用 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 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:key 创建散列时,如果我使用 : 或 , 或 - 和 redis 中最重要的一点,我们不会根据文档创建结构树: https://redis.io/topics/data-types-intro

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

  1. exec 只执行所有语句,因为这些原因应该是相同的,无论是否使用 multi 。

请对此主题的任何帮助或解释都会有很大帮助。 提前致谢。

【问题讨论】:

    标签: sorting hash redis set redis-cli


    【解决方案1】:

    现在我们正在使用命令排序

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

    我们从来没有得到结果,集合中的哈希值为 null,我不明白为什么?

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

    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"
    

    这样,命令 SORT 可以完美运行

    在这种情况下,您仅使用键名的“id”部分填充 Set,因此 GET 和 BY 子句映射到实际数据。澄清一下,这与使用(或缺少)MULTI 块无关。

    【讨论】:

    • 我继续不明白,对不起。
    • 此外,最重要的是,为什么如果我在集合中插入块多之间的哈希,我可以用我的密钥的最后一个 id 引用它,并且 SORT 按我的意愿工作,但如果我做同样的事情多我不能做同样的事吗?很抱歉,我不明白这看起来像是工具中的错误。
    • 如果同一组我有一个带有键 redishop:item:cars 和其他带有 redishop:itemsBig:truck 的哈希并且我想要卡车的价格会发生什么。我不可以吗?也许在文档中的任何参考我都不这么认为......因为最奇怪的是,如果我在多块之间做同样的事情并引用我的密钥的最后一个 id,以后我可以根据需要使用 SORT .
    • 但是如果我尝试在 multi 中做同样的事情,即 hmset car:1 name "X" price 3000 并且后来 make sadd mylist 1,我在集合中添加了与 car 不同的其他东西: 1 但是如果我把同样的东西做成多块我可以做到,我不明白为什么,也许这是工具 redis-cli 中的一个错误?
    • 对不起,我无法理解上一条评论中的问题。也许尝试一个新的问题,专注于那个问题并且只关注那个问题。
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多