2011-04-28 33 views
6

我有一個Redis的哈希如如何獲得redis hash值的數量?

key field value 

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

我怎麼能回答這樣多少狀態是「CA」的問題。我需要爲一個字段計數值。可能嗎 ?幫助將不勝感激。

-Avi

回答

5

我認爲你需要存儲單獨計數爲唯一值。你可以得到單個散列的長度,但當你在這種情況下得到三個不同的密鑰時不會。

命令鍵字段值

HSET千狀態 「CA」

HSET千拉鍊 「95054」

INCR CA

HSET 2000狀態 「CA」

HSET 2000 zip「95050」

INCR CA

HSET 3000狀態 「NY」

HSET 3000拉鍊 「12345」

INCR紐約

如果你想獲得多少哈希與國家 「CA」 鍵用途:

GET CA

1

我打算假設上面的數據是城市列表。真的,你可以考慮存儲這些像...

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

現在回到你的問題......在SQL中,你可能想要做這樣的事情:SELECT COUNT(*)FROM城市,狀態=「CA」 。或者,如果你想爲每個州的計數...選擇狀態,計數(*)從城市GROUP BY狀態。

在我看來,這是Redis掙扎了一下,但它使您能夠重新考慮您的數據庫設計。如果您計劃像這樣執行一個查詢,請考慮創建一個新的Sorted Set狀態集。在這種情況下,得分將是你的計數。使用ZINCRBY(當我們在城市「表格」中添加/刪除記錄時,我們稱之爲city_count_by_state)。現在你的查詢是這樣的:ZRANK city_count_by_state'CA'。添加/刪除/獲取排序集的排名在O(log(n))時間運行。

如果您不想使用排序集的浪費記憶,您可以使用密鑰返回城市「表」中的所有密鑰的大量列表。然後,您的程序可以自動遍歷這些密鑰並計算有多少個城市具有「CA」狀態。這是一點體力勞動,但它仍然會在O(n)時間運行。

如果您已經在數據庫中預先填入了城市數據,那麼您也可以使用KEYS(請參閱上面概述的方法)生成已排序集。希望這有助於!

參見:

0

假設你負責在哈希插入值,那麼使用多/ EXEC包散列插入和適當INCRS。因此,採取ptzOn的方法,但不要忘記把它包裝在MULTI/EXEC中以具有原子語義。在哈希上做同樣的事情刪除並使用DECR。