我有一个redis哈希,例如
key field value
1000 state "ca"
1000 zip "95054"
2000 state "ca"
2000 zip "95050"
3000 state "ny"
3000 zip "12345"
我怎样才能回答有多少州是“CA”的问题。我需要为一个字段计算值。可能吗 ?帮助将不胜感激。
-Avi
答案 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。