2013-06-04 2 views
1

당신은 정렬 된 집합 A를 redis로 가지고 있으며, 새 요소를 추가 할 때마다 순위별로 정렬됩니다. 당신은 또한 다음 20 초 말할 이상이 있었다 집합 A의 원소가 있는지 확인하는 방법이 있나요 소트 세트 B.Redis의 시간 소인 별 이전 요소 관리 정렬 된 집합

를 가지고 있고,이 검사 때문에 소트 세트의 B

로 이동 작업이 매우 빈번하게 수행되고 목록이 매우 커질 수 있습니다. 집합의 모든 요소를 ​​반복하는 것은 좋은 해결책이 아닙니다. 가장 빠른 것이 필요합니다.

감사합니다.

업데이트 : 기본적으로 생각한 것은 상대방이 경기 요청을했을 때 상대방과 일치하는 게임 서버가 있다고 상상해보십시오. 현재의 디자인은 모든 요청이 세트에 도착하고 순위/점수가 플레이어 순위입니다. 그래서 목록에서 서로 가까이있는 2 명의 플레이어가 모두 완벽하게 일치합니다. 매 5 초마다 스크립트 get이 호출되어 set의 맨 위에서 50 개의 행을 가져오고 2와 2를 일치시킵니다 (그리고 제거합니다). 이것은 잘 작동하고 있었고 매우 빠른 작업 솔루션이라고 생각합니다. 그러나 Bot (AI) 플레이어를 만드는 아이디어가 나왔습니다. 그래서 선수가 대기 시간이 너무 길 때 봇 (AI) 플레이어와 일치하게됩니다. 그리고 나는 "누가 너무 오랫동안 기다리고 있는지"볼 수있는 방법을 알아낼 수 없습니다. 기본적으로 전체 아이디어가 잘못되었습니다. 그래서 더 좋은 아이디어는 환영합니다. :) 고마워요.

+1

당신은 타임 스탬프와 함께 요소를 점수로 저장할 수있는 보조 정렬 집합을 사용할 수 있습니다. – akonsu

+0

내가 타임 스탬프를 점수로 사용할 수 있을지 모르겠다. 다른 점수에 사용 된 점수. 더 많은 정보로 게시물을 업데이트했습니다. 감사! –

+2

나는 기존의 것 외에 다른 순서 집합을 만들고, 타임 스탬프를 점수로 사용하도록 제안하고 있습니다. – akonsu

답변

4

정렬 된 집합의 점수가 유닉스 시간 소인 경우 zrange을 사용하여 집합 A에서 가장 오래된 NN 항목을 가져올 수 있습니다. 그런 다음 수표를 찍고 B를 설정하기 위해 해당 항목을 추가 한 다음 A 집합에서 제거합니다

세트 A의 채점이 타임 스탬프를 기반으로하지 않는 경우 세트 A 전체를 반복하거나 디자인을 다시 생각해야합니다. Redis 키에는 추가 된 타임 스탬프가 없습니다 (정렬 된 세트와 같은 키의 항목에 대해 이중으로 적용됨). 따라서 사용자가 특별히 작성하고 추적해야하는 항목이어야합니다. 아마도 당신이하고있는 일에 대해 더 많이 나누고 왜 우리가 더 많은 세부 사항을 도울 수 있는지.

편집 : 질문에 대한 추가 사항을 기반으로, @akonsu가 제안하는 것과 유사한 솔루션을 시도하는 것이 좋습니다.

구체적으로 : Sorted-Set-A : 플레이어가 현재와 마찬가지로 순위별로 정렬됩니다.

정렬 된 집합 B : 은 대기열에 들어간 시간으로 timestamp를 사용하고 사용자 ID를 저장합니다. 즉, SetA에 대한 등급이 & 인 ID로 zadd하면 타임 스탬프와 ID로 SetB를 zadd합니다.

플레이어와 일치하면 두 세트에서 플레이어를 제거합니다. zrange 명령을 사용하여 SetB에서 일치하는 사용자 집합을 가져 와서 X 개의 가장 오래된 항목을 가져 오는 경우 대기열에있는 항목 (FIFO와 같은)의 순서대로 대기합니다. 그런 다음 SetA에서 zrange 명령을 사용하여 +/- 순위 범위를 지정하십시오. 경기를하는 경우 두 세트에서 경기를 제거하고 계속 진행하여 경기를 진행합니다.

SetA에 적절한 상대방이없고 해당 시간 기록이 AI와 일치 할만큼 오래된 경우 두 세트에서 모두 제거하고 계속 진행합니다.

기본적으로 users-> timestamp의 색인 대기열입니다. 이 방법을 사용하면 모든 사용자가 대기열 길이 순서대로 일치하므로 대기 시간이 단축됩니다. 플레이어의 순위에 따라 매칭에는 여전히 SetA를 사용하지만, 이제는 시간을 기준으로 인덱싱하고 우선 순위를 지정합니다.

특정 구현은 이보다 약간 재미있을 수도 있지만 전반적인 전략으로서 이것이 필요한 것 같아요.

+0

감사합니다! 오늘 노력하겠습니다. –