怎麼統計redis的hash中的某個字段個數,在線等
迷茫
迷茫 2017-04-24 16:00:39
0
5
948

存放的hash這樣的:

user:1 => id:1, name: 'a', age:30, sex:1
user:2 => id:2, name: 'b', age:18, sex:0
user:3 => id:3, name: 'c', age:22, sex:1
user:4 => id:4, name: 'd', age:10, sex:0

我想統計sex為1的用戶有幾個?

另外再複雜一點,以age分組,分成三組[age<15, 15<=age<25, age>=25],分別統計用使用者的個數

剛入redis,找遍了資料,沒有發現相關的文件

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(5)
仅有的幸福

Redis 的特性決定了它本身就不適合做統計方面的操作。因為沒有像 SQL 一樣的結構化查詢語言。這裡為你提供一個解決思路,但是需要修改你的資料組織方式:

在 redis 中,如果的確有統計的需求,可以使用 SortedSet 有序集合。有序集合中每個 key 對應一個 score,可以依照 score 來排序取值。

舉例:

redis> ZADD age 10 jack
(integer) 0
redis> ZADD age 15 tom
(integer) 0
redis> ZADD age 25 peter
(integer) 0

上面的代碼為 age 這個有序集合插入了三條數據,以三人的 age 作為 score。如果你想統計年齡區間在10-20之間的,如下:

ZRANGEBYSCORE age 10 20

如果說你要存儲的資料不是簡單的字串,沒有辦法直接作為 key 來存儲,可以有以下兩種方案解決:

  1. 將資料轉為 json 格式的字串作為 key,取出時再將 json 字串還原為程式碼可支援的格式。例如在 python 中就可以使用 json.dumps 将字典转为字符串,从 redis 取出时再使用json.loads還原。

  2. 以 id 作為 key,然後再使用另外的 hash 或其他資料結構來儲存實際使用者資訊。這樣就需要先根據統計欄位查出 id,再根據 id 去查完整信息,需要有兩次查詢。

但是以上的解決方案只適用於你只有一個用來統計的字段,例如你提到的年齡。 如果你有多種統計需求,理論上肯定也有解決方案,但是我覺得你應該考慮一下是否真的需要使用 redis 來完成這個工作。畢竟 redis 的使用場景限制了它無法做像 SQL 一樣複雜多樣的統計。你可以考慮一下其他的 NoSQL,像是 mongodb。

根據你的使用場景選擇工具才是最明智的,而不是手上有把錘子就看什麼都是釘子。

伊谢尔伦

必須在 redis-cli 中處理麼?用別的語言存取redis 可以拿出 user:* 然後遍歷計數。
我也是剛開始用 redis =.=

世界只因有你

redis的查詢,應該只能透過key了,key可以依照規則匹配,你在key上做手段吧。

phpcn_u1582

別強求,換關係型資料庫吧。

或每次插入資料之後,自增一個專門用於統計的key。
INCR('sex:1')
INCR('sex:1')

INCR('age:0')
INCR('age:1')
INCR('age:2')
0/1/2表示年齡分組

仅有的幸福

如果不做應用,只是知道某個hash key 有多少個值,很簡單 Hkey keyname ,會列出所有 field,然後redis自動給你一個排序號,也就是個數統計了,不是嗎? !

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板