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

阅读 10.2k
5 个回答

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。

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

必须在 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自动给你一个排序号,也就是个数统计了,不是吗?!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏