存储的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을 사용할 수 있습니다. 정렬된 세트의 각 키는 점수에 해당하며, 값은 점수에 따라 정렬될 수 있습니다.
예:
으아아아위 코드는 세 사람의 나이를 점수로 사용하여 세 가지 데이터를 연령 정렬 세트에 삽입합니다. 10~20세 사이의 연령 범위를 계산하려면 다음과 같이 하세요.
으아아아저장하려는 데이터가 단순한 문자열이 아니고 이를 키로 직접 저장할 수 있는 방법이 없다면 다음 두 가지 해결 방법이 있습니다.
데이터를 json 형식의 문자열로 키로 변환한 후, json 문자열을 꺼낼 때 코드가 지원할 수 있는 형식으로 복원합니다. 예를 들어 Python에서는
json.dumps
을 사용하여 사전을 문자열로 변환한 다음, Redis에서 가져올 때json.loads
을 사용하여 복원할 수 있습니다.id를 키로 사용한 후 다른 해시나 다른 데이터 구조를 사용하여 실제 사용자 정보를 저장합니다. 이런 방식으로 먼저 통계 필드를 기반으로 ID를 알아낸 다음 ID를 기반으로 완전한 정보를 확인해야 하는데, 이는 두 번의 쿼리가 필요합니다.
하지만 위의 해결 방법은 언급한 연령과 같이 통계 필드가 하나만 있는 경우에만 적용됩니다. 통계적 요구가 여러 개인 경우 이론적으로는 해결책이 있어야 하지만 이 작업을 완료하기 위해 Redis를 사용해야 하는지 고려해야 한다고 생각합니다. 결국 Redis의 사용 시나리오는 SQL만큼 복잡하고 다양한 통계를 수행하는 능력을 제한합니다. mongodb와 같은 다른 NoSQL을 고려할 수 있습니다.
손에 망치가 있다면 모든 것을 못으로 보기보다는 사용 시나리오에 따라 도구를 선택하는 것이 가장 현명합니다.
redis-cli에서 처리해야 하나요? 다른 언어로 Redis에 액세스하려면 user:*를 가져온 다음 개수를 순회하면 됩니다.
이제 막 redis를 사용하기 시작했습니다 =.=
Redis 쿼리는 키를 통해서만 이루어져야 하며 키는 규칙에 따라 일치할 수 있습니다.
강요하지 말고 관계형 데이터베이스로 전환하세요.
또는 데이터를 삽입할 때마다 통계용으로 특별히 키를 추가하세요.
INCR('sex:1')
INCR('sex:1')
INCR('age:0')
INCR('age:1')
INCR('age:2')
0/1/2은 연령대를 나타냅니다
애플리케이션을 만들지 않고 특정 해시 키에 몇 개의 값이 있는지만 알고 있다면 매우 간단합니다. Hkey keyname은 모든 필드를 나열한 다음 redis가 자동으로 정렬 번호를 제공합니다. 계산해, 그렇지? !