복붙노트

[REDIS] 초고속 데이터 저장소 찾고 교차 작업을 수행하는

REDIS

초고속 데이터 저장소 찾고 교차 작업을 수행하는

나는 Resque를위한 백엔드로 잠시 동안 레디 스를 사용하고 지금은 대량의 데이터에 교차 작업을 수행 할 수있는 빠른 방법을 찾고 있어요 것을, 나는 레디 스에게 기회를 제공하기로 결정했다.

나는 다음과 같은 테스트를 실시했습니다 :

- X, Y 및 Z는 모두 약 포함 레디 스 세트이다. 1,000,000 부재 (3M + 멤버를 함유하는 시드 어레이로부터 취해진 임의의 정수).

- 내가 sintersectstore을 사용하고 있으므로 (데이터가 서버에서 클라이언트로 검색에 의한 과열을 피하려면), 교차 x 및 y 및 z하려는

sinterstore r x y z

- 결과 세트 (R)은 레디 스 약 0.5 초에 세트를 계산 만 약 절반 부재를 포함한다.

0.5 초는 나쁘지 않다,하지만 난 억 명 멤버 각각의보다 더 포함 할 수있다 세트에 같은 계산을 수행해야합니다.

나는 레디 스 같은 거대한 세트와 어떻게 반응하는지 테스트 해 보지 않았다 그러나 나는 많은에게 데이터를 처리하는 데 시간이 더 걸릴 것이라고 가정한다.

내가 지금 뭐하는 거지? 그렇게 할 수있는 빠른 방법이 있나요?

노트:

- 내가 여러 노동자가 액세스 할 것이다 분산 된 데이터 저장소를 찾고 있어요 때문에 기본 배열은 옵션이 아니다.

- 내가 RAM 16GB의와 3.4GHz로 맥 @ 8 개 코어에서 이러한 결과를 얻을 수, 디스크 저장은 레디 스 구성에 비활성화되었습니다.

해결법

  1. ==============================

    1.나는 비트 맵 최선의 희망 용의자.

    나는 비트 맵 최선의 희망 용의자.

    내 경험에 의하면, 비트 맵을위한 완벽한 서버 인 레디 스; 당신은 (레디 스에서 사용할 수있는 5 명 개의 데이터 구조 중 하나를) 문자열 데이터 구조를 사용합니다

    많은 혹은 모든 사용자가 수행해야하는 작업의 원자 작업으로, 즉시 사용할 수 레디 스에 있습니다

    레디 스의 SETBIT 동작 O 시간 복잡도를 갖는 (1)

    전형적인 구현에서, 당신은 다음, 비트 문자열 값을 오프셋 오프셋 대응 (또는 인덱스)에 각 비트를 설정하기 위해 배열 값을 해시 것이다; 그래서 같은 :

    >>> r1.setbit('k1', 20, 1)
    

    첫 번째 인자는 오프셋 (지표 값)이며, 세 번째는 비트 맵의 ​​해당 인덱스의 값은 중요하다.

    조금이 오프셋 (20), 호출에 설정되어있는 경우 찾을 수있는 비트 문자열의 키를 전달 getbit.

    >>> r1.getbit('k1', 20)
    

    다음 해당 비트 맵에, 당신은 물론, XOR을, 예를 들어, 일반적인 비트 연산을 수행하는 논리 AND, OR 수 있습니다.

  2. from https://stackoverflow.com/questions/9471078/looking-for-an-ultrafast-data-store-to-perform-intersect-operations by cc-by-sa and MIT license