redis 를 이용 하여 차 트 를 실현 하 는 작은 비결
차 트 는 인터넷 응용 에서 없어 서 는 안 될 요소 로 서 인류 자체 의 대비 욕 구 를 불 러 일 으 켜 상품 의 판 매 량 을 증가 시 킬 수 있다.
차 트 의 수요 에 대해 redis 는 데이터 구조 가 이 일 을 하기에 매우 적합 하 다.그것 이 바로 질서 있 는 집합(sorted set)이다.
일상적인 간단 한 활동 개발 에서 저 는 사용자 의 가치 등에 대해 순 위 를 매 겨 야 하 는 경우 가 많 습 니 다.이때 보통 redis 의 질서 있 는 집합 을 선택 하여 사용자 의 점 수 를 저장 하지만 서로 다른 장면 순위 의 방식 도 약간 다 릅 니 다.다음은 자신의 일상적인 개발 에 따라 요약 하고 정리 하 겠 습 니 다.
Redis 질서 있 는 집합(정렬 세트)
우선 질서 있 는 집합 이 무엇 인지 간단히 소개 하 겠 습 니 다.
Redis 의 Sorted Set 은 String 형식의 질서 있 는 집합 입 니 다.집합 구성원 이 유일한 것 은 집합 에서 중복 되 는 데이터 가 나 오지 않 는 다 는 것 을 의미한다.
모든 요 소 는 double 형식의 점수 와 연 결 됩 니 다.redis 는 바로 점 수 를 통 해 집합 중인 구성원 을 위해 어 릴 때 부터 큰 순 서 를 매 긴 다.
질서 있 게 집합 하 는 멤버 는 유일 하지만 점수(score)는 중복 할 수 있다.
집합 은 해시 표를 통 해 이 루어 지기 때문에 추가,삭제,검색 의 복잡 도 는 모두 O(1)이다.집합 중 가장 큰 구성원 수 는 232-1(4294967295 로 집합 당 40 억 여 명의 구성원 을 저장 할 수 있다)이다.
응용 장면
장면 1:사용자 의 점수 가 높 을 수록 순위 가 앞 선다.
이것 은 가장 간단 하고 기본 적 인 응용 장면 으로 사용 하 는 명령 과 기본 조작 은 다음 과 같다.
ZADD:멤버 점수 추가 또는 업데이트
명령 매개 변수:
ZADD key score member [[score member] [score member] ...]
하나 이상 의 member 요소 와 score 값 을 질서 있 는 집합 key 에 추가 합 니 다.만약 에 한 member 가 질서 있 는 집합 구성원 이 라면 이 member 의 score 값 을 업데이트 하고 이 member 요 소 를 다시 삽입 하여 이 member 가 정확 한 위치 에 있 도록 합 니 다.
score 값 은 정수 나 이중 정밀도 부동 소수점 일 수 있 습 니 다.
key 가 존재 하지 않 으 면 빈 질서 집합 을 만 들 고 ZADD 작업 을 수행 합 니 다.
키 가 존재 하지만 질서정연 한 집합 형식 이 아 닐 때 오 류 를 되 돌려 줍 니 다.
예시:
// A(user1) 50,
ZADD user_rank 50 user1
// B(user2) 60、 C(user3) 70,
ZADD user_rank 60 user2 70 user3 // user2、user3 , 2、3
ZREVRANK:멤버 의 현재 랭 킹 획득명령 매개 변수:
ZREVRANK key member
질서 있 는 집합 key 의 구성원 member 순 위 를 되 돌려 줍 니 다.그 중에서 질서 있 는 집합 구성원 은 score 값 에 따라 점점 줄 어 들 고(큰 것 에서 작은 것 까지)정렬 합 니 다.순 위 는 0 을 밑 으로,즉 스코어 가 가장 큰 멤버 순 위 는 0 이다.
예시:
// A
ZREVRANK user_rank user1 // user1 , 2
ZSCORE:사용자 랭 킹 획득명령 매개 변수:
ZSCORE key member
질서 있 는 집합 key 에서 구성원 member 의 score 값 을 되 돌려 줍 니 다.member 요소 가 키 를 질서 있 게 집합 하지 않 거나 키 가 존재 하지 않 으 면 nil 로 돌아 갑 니 다.
예시:
// A
ZSCORE user_rank user1 // user1 50, "50" #
장면 2:사용자 게임 에서 가장 짧 은 시간 을 소비 하고 순위 가 앞 선다.이것 도 가장 간단 하고 기본 적 인 응용 장면 이 라 고 할 수 있 습 니 다.사용 하 는 명령 과 기본 조작 과 장면 이 다 르 지 않 습 니 다.순위 획득 명령 이 다른 것 을 제외 하고:
ZRANK:멤버 의 현재 랭 킹 획득
명령 매개 변수:
ZRANK key member
질서 있 는 집합 key 의 구성원 member 순 위 를 되 돌려 줍 니 다.그 중에서 질서 있 는 집합 구성원 은 score 값 이 증가 하 는 순서에 따라 배열 된다.순 위 는 0 을 밑 으로,즉 스코어 가 가장 작은 멤버 순 위 는 0 이다.
상기 두 장면 에서 사용자 점수 가 같은 상황 을 어떻게 처리 합 니까?
만약 두 사용자 score 가 같다 면,redis 는 어떻게 정렬 합 니까?
score 가 같은 상황 에서 redis 는 사전 으로 정렬 합 니 다.
그럼 사전 정렬 은 무엇 입 니까?다음 그림 을 믿 으 면 이 의문 을 풀 수 있 습 니 다.
score 가 같은 상황 에서 redis 는 사전 을 사용 하여 순 서 를 매 긴 다.이른바 사전 순 서 는 바로'ABCDEFG','123456...'와 같은 순 서 였 다.이니셜 이 같은 상황 에서 redis 는 뒤의 자 모 를 비교 할 것 인가,아니면 사전 에 따라 순 서 를 매 길 것 인가?
장면 1:사용자 의 점수 가 높 을 수록 순위 가 앞 선다.만약 에 점수 가 같은 상황 에서 이 점수 에 먼저 달 한 사용자 가 앞 선다.
이 장면 에서 우 리 는 사용자 의 점수 구성 을 바 꿔 야 한다.구체 적 인 사 고 는 다음 과 같다.
Math.pow(2,53)-1//9007199254740991,16 자리 수
타임 스탬프 는 이미 13 자리 수 를 차 지 했 기 때문에 사용자 의 진짜 점 수 를 저장 하 는 데 남 은 것 은 3 자리 수 밖 에 남지 않 았 다.
그래서 더 블 정밀도 부동 소수점 형식 을 score 로 사용 하 는 것 이 좋 습 니 다.
따라서 가장 좋 은 score 구 조 는 점수+'.'+시간 스탬프 로 부동 소수점 으로 변 합 니 다.
장면 2:사용자 가 게임 을 완성 하 는 시간 이 가장 짧 고 순위 가 앞 에 있 습 니 다.만약 에 게임 을 완성 하 는 시간 이 같은 상황 에서 이 기록 을 먼저 달성 한 사용자 가 앞 에 있 습 니 다.
이 장면 에서 저 희 는 사용자 의 score 구성 을 변경 해 야 합 니 다.구체 적 인 사 고 는 다음 과 같 습 니 다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redis 해시에 대한 완벽한 가이드변경 가능하므로 필요에 따라 쉽게 변경하고 업데이트할 수 있습니다. Redis 해시는 구조가 평평하므로 JSON에서와 같이 여러 수준을 가질 수 없습니다. redis 해시의 명명 규칙은 hash:key 로 입력되므로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.