ホームページ  >  に質問  >  本文

怎么统计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,找遍了资料,没有发现相关的文档

迷茫迷茫2705日前879

全員に返信(5)返信します

  • 仅有的幸福

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

    Redisの特性上、統計演算には適していないと判断されます。 SQL のような構造化クエリ言語がないからです。これが解決策ですが、データ構成を変更する必要があります:

    Redis では、本当に統計的なニーズがある場合は、SortedSet 順序付きセットを使用できます。順序付きセット内の各キーはスコアに対応しており、値はスコアに従って並べ替えることができます。

    例:

    リーリー

    上記のコードは、3 人の年齢をスコアとして使用して、年齢ソート セットに 3 つのデータを挿入します。 10~20歳までの年齢範囲を数えたい場合は、次のようにします:

    リーリー

    保存したいデータが単純な文字列ではなく、それをキーとして直接保存する方法がない場合は、次の 2 つの解決策があります:

    1. データをキーとしてjson形式の文字列に変換し、取り出す際にコードがサポートできる形式にjson文字列を復元します。たとえば、json.dumps 将字典转为字符串,从 redis 取出时再使用json.loads を使用して Python で復元できます。

    2. ID をキーとして使用し、別のハッシュまたはその他のデータ構造を使用して実際のユーザー情報を保存します。この方法では、まず統計フィールドに基づいて ID を見つけ、次にその ID に基づいて完全な情報を確認する必要があり、これには 2 つのクエリが必要です。

    ただし、上記の解決策は、あなたが言及した年齢など、統計のフィールドが 1 つしかない場合にのみ適用されます。 複数の統計ニーズがある場合、理論的には解決策があるはずですが、この作業を完了するために本当に Redis を使用する必要があるかどうかを検討する必要があると思います。結局のところ、redis の使用シナリオにより、SQL と同じくらい複雑かつ多様な統計を実行する能力が制限されます。 mongodb などの他の NoSQL を検討することもできます。

    手にハンマーがあれば何でも釘として見るのではなく、使用シナリオに基づいてツールを選択するのが最も賢明です。

    返事
    0
  • 伊谢尔伦

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

    redis-cli で処理する必要がありますか?他の言語で Redis にアクセスするには、user:* を取り出してカウントを調べます。
    redis を使い始めたばかりです =.=

    返事
    0
  • 世界只因有你

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

    Redis クエリはキーを介してのみ行う必要があり、キーに対して何かを行うことができます。

    返事
    0
  • phpcn_u1582

    phpcn_u15822017-04-24 16:02:39

    無理に使用するのではなく、リレーショナル データベースに切り替えてください。

    または、データを挿入するたびに統計専用のキーを追加します。
    INCR('性別:1')
    INCR('性別:1')

    INCR('age:0')
    INCR('age:1')
    INCR('age:2')
    0/1/2は年齢層を表します

    返事
    0
  • 仅有的幸福

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

    アプリケーションを作成せず、特定のハッシュ キーに含まれる値の数だけを知っている場合、Hkey keyname ですべてのフィールドがリストされ、redis が自動的にソート番号 (カウント) を与えます。 、 右? !

    返事
    0
  • キャンセル返事