如何编写查询以将多个值添加到REDIS哈希表中的一个键?

11

我查看了REDIS Hashes的命令列表。在REDIS中,是否可以为哈希键分配多个值?例如,我正在尝试以哈希表的形式表示以下表格。

 Prod_Color  |   Prod_Count  |   Prod_Price   |   Prod_Info
------------------------------------------------------------
  Red        |       12      |       300      |   In Stock
  Blue       |        8      |       310      |   In Stock

我接着尝试了以下哈希命令

HMSET Records Prod_Color "Red" Prod_Count 12 Prod_Price 300 Prod_Info "In Stock"

HMSET Records Prod_Color "Blue" Prod_Count 8 Prod_Price 310 Prod_Info "In Stock"

然而,当我尝试使用命令HGETALL Records检索哈希时,我只能看到插入值的第二行(即Blue、8、310、In Stock)!我知道我可以创建一个单独的哈希并插入第二行的值,但是我打算将所有值都插入到一个单一的哈希表中。


2
感谢您的回复!因此,为了创建哈希数组,我需要使用集合。 - abhijit k
@abhijit 可能是这样。此外,在 redis-cli 中尝试一些东西是掌握 Redis 的好方法。 - Niloct
3个回答

11

你可以做的,而且我在我的代码以外的其他地方也看到过这样的用法,就是使用后缀来作为哈希的键。你可能有一个后缀来识别每个记录,这里我将使用颜色来举例:

在插入时:

HMSET Records:red Prod_Color "Red" Prod_Count 12 Prod_Price 300 Prod_Info "In Stock"
HMSET Records:blue Prod_Color "Blue" Prod_Count 8 Prod_Price 310 Prod_Info "In Stock"

/* For each HMSET above, you issue SADD */
SADD Records:Ids red
SADD Records:Ids blue

在查询时:

/* If you want to get all products, you first get all members */
SMEMBERS Records:Ids

/* ... and then for each member, suppose its suffix is ID_OF_MEMBER */
HGETALL Records:ID_OF_MEMBER

/* ... and then for red and blue (example) */
HGETALL Records:red
HGETALL Records:blue

你可能希望使用 主键 作为后缀,因为这应该可以从关系型数据库记录中获得。此外,在删除哈希键时(例如,DEL Records:red),必须维护成员集合(例如,SREM Records:Ids red)。还要记住,Redis非常适用于改进缓存,必须将其设置好以保持值的持久性(并维护良好的性能)。


根据Redis 4.0.0的规定,HMSET被视为已弃用。请在新代码中优先使用HSET。 - Martin

5

在哈希表中,不能有多个使用相同键的项。但是,如果您想要检索所有项或按键检索单个行,则可以使用JSON:

Records red = {color:red, price:12, info:"300 in stock"}
Records blue = {color:blue, price:8, info:"310 in stock"}

如果您不想使用json,您将需要使用多个哈希表,其中一个哈希表是表中的一行。您可以通过存储一个包含每个哈希表键的集合来支持获取所有功能。


1

我认为你误解了哈希表的工作原理。你不能有两个具有不同值的相同字段。你的第二个HMSET命令正在覆盖第一个命令的值。你需要使用唯一的字段或不同的键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接