如何在redis哈希中获取值的计数?

时间:2011-04-28 21:50:37

标签: redis

我有一个redis哈希,例如

key field value

1000 state "ca" 
1000 zip "95054"
2000 state "ca" 
2000 zip "95050"
3000 state "ny" 
3000 zip "12345"

我怎样才能回答有多少州是“CA”的问题。我需要为一个字段计算值。可能吗 ?帮助将不胜感激。

-Avi

3 个答案:

答案 0 :(得分:5)

我认为您需要为唯一值存储单独的计数。您可以获得单个哈希的长度,但在这种情况下,您可以获得三个不同的密钥。

命令键字段值

  

HSET 1000州“ca”

     

HSET 1000 zip“95054”

     

INCR ca

     

HSET 2000州“ca”

     

HSET 2000 zip“95050”

     

INCR ca

     

HSET 3000状态“ny”

     

HSET 3000 zip“12345”

     

INCR ny

如果你想获得状态为“ca”的哈希键的数量:

  

GET ca

答案 1 :(得分:1)

我将假设上面的数据是城市列表。真的,你可以考虑存储这些... ...

key              value
city:1000:state  "ca"
city:1000:zip    "95054"
city:2000:state  "ca"
city:2000:zip    "95050"

现在回到你的问题......在SQL中,你可能想要做类似的事情:SELECT Count(*)FROM cities WHERE state ='CA'。或者,如果你想要每个州的计数...... SELECT状态,COUNT(*)FROM cities GROUP BY状态。

在我看来,这是Redis有点挣扎的东西,但它让你能够重新思考你的数据库设计。如果您计划执行类似这样的查询,请考虑创建一个新的排序状态集。在这种情况下,分数将是您的计数。在您的城市“表”中添加/删除记录时,请在此设置上使用 ZINCRBY (让我们称之为city_count_by_state)。现在您的查询类似于: ZRANK city_count_by_state'CA'。在排序集上添加/删除/获取排名在O(log(n))时间内运行。

如果您不希望废弃内存带有分类集,则可以使用 KEYS 返回城市“表”中所有密钥的大型列表。然后,您的程序可以自动迭代这些键并计算有多少个城市具有“CA”状态。这是一些手工劳动,但它仍然会在O(n)时间运行。

如果您已在数据库中预先填充了城市数据,则还可以使用 KEYS 生成已排序的集合(请参阅上面概述的方法)。希望这有帮助!

请参阅:

答案 2 :(得分:0)

假设您负责在哈希中插入值,然后使用MULTI / EXEC来包装哈希插入和适当的INCRS。所以采取ptzOn的方法,但不要忘记将它全部包含在MULTI / EXEC中以具有原子语义。在哈希删除上执行相同的操作并使用DECR。