存储的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,找遍了资料,没有发现相关的文档
The characteristics of Redis determine that it is not suitable for statistical operations. Because there is no structured query language like SQL. Here is a solution for you, but you need to modify your data organization:
In redis, if you really have statistical needs, you can use SortedSet. Each key in the ordered set corresponds to a score, and the values can be sorted according to the score.
For example:
The above code inserts three pieces of data into the age sorted set, using the age of the three people as the score. If you want to count the age range between 10-20, as follows:
If the data you want to store is not a simple string and there is no way to store it directly as a key, there are two solutions:
Convert the data to a string in json format as the key, and then restore the json string to a format supported by the code when taking it out. For example, you can use
json.dumps
将字典转为字符串,从 redis 取出时再使用json.loads
restore in python.Use id as the key, and then use another hash or other data structure to store actual user information. In this way, you need to first find out the id based on the statistical field, and then check the complete information based on the id, which requires two queries.
But the above solution only applies if you only have one field for statistics, such as the age you mentioned. If you have multiple statistical needs, there must be a solution in theory, but I think you should consider whether you really need to use redis to complete this work. After all, the usage scenarios of redis limit its ability to perform statistics as complex and diverse as SQL. You can consider other NoSQL, such as mongodb.
It is wisest to choose tools based on your usage scenarios, rather than just looking at everything as a nail if you have a hammer in your hand.
Does it have to be handled in redis-cli? To access redis in other languages, you can take out user:* and then traverse the count.
I just started using redis =.=
Redis query should only be through the key. The key can be matched according to the rules. You can do something on the key.
Don’t force it, just switch to a relational database.
Or add a key specifically for statistics every time you insert data.
INCR('sex:1')
INCR('sex:1')
INCR('age:0')
INCR('age:1')
INCR('age:2')
0/1/2 represents age group
If you don’t make an application and just know how many values a certain hash key has, it’s very simple. Hkey keyname will list all fields, and then redis will automatically give you a sort number, which is a count, right? !