存放的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,找遍了資料,沒有發現相關的文件
仅有的幸福2017-04-24 16:02:39
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 來存儲,可以有以下兩種方案解決:
將資料轉為 json 格式的字串作為 key,取出時再將 json 字串還原為程式碼可支援的格式。例如在 python 中就可以使用 json.dumps
将字典转为字符串,从 redis 取出时再使用json.loads
還原。
以 id 作為 key,然後再使用另外的 hash 或其他資料結構來儲存實際使用者資訊。這樣就需要先根據統計欄位查出 id,再根據 id 去查完整信息,需要有兩次查詢。
但是以上的解決方案只適用於你只有一個用來統計的字段,例如你提到的年齡。 如果你有多種統計需求,理論上肯定也有解決方案,但是我覺得你應該考慮一下是否真的需要使用 redis 來完成這個工作。畢竟 redis 的使用場景限制了它無法做像 SQL 一樣複雜多樣的統計。你可以考慮一下其他的 NoSQL,像是 mongodb。
根據你的使用場景選擇工具才是最明智的,而不是手上有把錘子就看什麼都是釘子。
phpcn_u15822017-04-24 16:02:39
別強求,換關係型資料庫吧。
或每次插入資料之後,自增一個專門用於統計的key。
INCR('sex:1')
INCR('sex:1')
INCR('age:0')
INCR('age:1')
INCR('age:2')
0/1/2表示年齡分組
仅有的幸福2017-04-24 16:02:39
如果不做應用,只是知道某個hash key 有多少個值,很簡單 Hkey keyname ,會列出所有 field,然後redis自動給你一個排序號,也就是個數統計了,不是嗎? !