搜尋

首頁  >  問答  >  主體

怎麼統計redis的hash中的某個字段個數,在線等

存放的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,找遍了資料,沒有發現相關的文件

迷茫迷茫2795 天前946

全部回覆(5)我來回復

  • 仅有的幸福

    仅有的幸福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 來存儲,可以有以下兩種方案解決:

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

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

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

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

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-24 16:02:39

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

    回覆
    0
  • 世界只因有你

    世界只因有你2017-04-24 16:02:39

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

    回覆
    0
  • phpcn_u1582

    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表示年齡分組

    回覆
    0
  • 仅有的幸福

    仅有的幸福2017-04-24 16:02:39

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

    回覆
    0
  • 取消回覆