怎么统计redis的hash中的某个字段个数,在线等

 CH_Double_C 发布于 2022-10-26 23:25

存储的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 个回答
  • 如果不做应用,只是知道某个hash key 有多少个值,很简单 Hkey keyname ,会列出所有 field,然后redis自动给你一个排序号,也就是个数统计了,不是吗?!

    2022-10-27 01:51 回答
  • 别强求,换关系型数据库吧。

    或者每次插入数据之后,自增一个专门用于统计的key。
    INCR('sex:1')
    INCR('sex:1')

    INCR('age:0')
    INCR('age:1')
    INCR('age:2')
    0/1/2表示年龄分组

    2022-10-27 01:51 回答
  • redis的查询,应该只能通过key了,key可以根据规则匹配,你在key上做手段吧。

    2022-10-27 01:52 回答
  • 必须在 redis-cli 中处理么?用别的语言访问redis 可以拿出 user:* 然后遍历计数。
    我也是刚开始用 redis =.=

    2022-10-27 01:52 回答
  • 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。

    根据你的使用场景选择工具才是最明智的,而不是手里有把锤子就看什么都是钉子。

    2022-10-27 01:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有