存放的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,找遍了資料,沒有發現相關的文件
Redis 的特性決定了它本身就不適合做統計方面的操作。因為沒有像 SQL 一樣的結構化查詢語言。這裡為你提供一個解決思路,但是需要修改你的資料組織方式:
在 redis 中,如果的確有統計的需求,可以使用 SortedSet 有序集合。有序集合中每個 key 對應一個 score,可以依照 score 來排序取值。
舉例:
上面的代碼為 age 這個有序集合插入了三條數據,以三人的 age 作為 score。如果你想統計年齡區間在10-20之間的,如下:
如果說你要存儲的資料不是簡單的字串,沒有辦法直接作為 key 來存儲,可以有以下兩種方案解決:
將資料轉為 json 格式的字串作為 key,取出時再將 json 字串還原為程式碼可支援的格式。例如在 python 中就可以使用
json.dumps
将字典转为字符串,从 redis 取出时再使用json.loads
還原。以 id 作為 key,然後再使用另外的 hash 或其他資料結構來儲存實際使用者資訊。這樣就需要先根據統計欄位查出 id,再根據 id 去查完整信息,需要有兩次查詢。
但是以上的解決方案只適用於你只有一個用來統計的字段,例如你提到的年齡。 如果你有多種統計需求,理論上肯定也有解決方案,但是我覺得你應該考慮一下是否真的需要使用 redis 來完成這個工作。畢竟 redis 的使用場景限制了它無法做像 SQL 一樣複雜多樣的統計。你可以考慮一下其他的 NoSQL,像是 mongodb。
根據你的使用場景選擇工具才是最明智的,而不是手上有把錘子就看什麼都是釘子。
必須在 redis-cli 中處理麼?用別的語言存取redis 可以拿出 user:* 然後遍歷計數。
我也是剛開始用 redis =.=
redis的查詢,應該只能透過key了,key可以依照規則匹配,你在key上做手段吧。
別強求,換關係型資料庫吧。
或每次插入資料之後,自增一個專門用於統計的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自動給你一個排序號,也就是個數統計了,不是嗎? !