存储的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,找遍了资料,没有发现相关的文档
Redis 的特性决定了它本身就不适合做统计方面的操作。因为没有像 SQL 一样的结构化查询语言。这里为你提供一种解决思路,但是需要修改你的数据组织方式:
在 redis 中,如果的确有统计的需求,可以使用 SortedSet 有序集合。有序集合中每个 key 对应一个 score,可以根据 score 来排序取值。
举个例子:
上面的代码为 age 这个有序集合插入了三条数据,以三人的 age 作为 score。如果你想统计年龄区间在10-20之间的,如下所示:
如果说你要存储的数据不是简单的字符串,没有办法直接作为 key 来存储,可以有以下两种方案解决:
将数据转为 json 格式的字符串作为 key,取出时再将 json 字符串还原为代码可支持的格式。比如在 python 中就可以使用
json.dumps
将字典转为字符串,从 redis 取出时再使用json.loads
还原。以 id 作为 key,然后再使用另外的 hash 或者其他数据结构来存储实际用户信息。这样就需要先根据统计字段查出 id,再根据 id 去查完整信息,需要有两次查询。
但是以上的解决方案只适用于你只有一个用来统计的字段,比如你提到的年龄。如果你有多种统计需求,理论上来说肯定也有解决方案,但是我觉得你应该考虑一下是否真的需要使用 redis 来完成这个工作。毕竟 redis 的使用场景限制了它无法做像 SQL 一样复杂多样的统计。你可以考虑一下其他的 NoSQL,比如 mongodb。
根据你的使用场景选择工具才是最明智的,而不是手里有把锤子就看什么都是钉子。