복붙노트

[REDIS] 사용 레디 스는 제한된 범위에서 고유 ID를 생성하는

REDIS

사용 레디 스는 제한된 범위에서 고유 ID를 생성하는

나는 그들의 기본 키 외에, 항목이 속해있는 그룹에 고유 인덱스를 필요 데이터베이스 항목이있다. 우리가 그룹을 전화 할게 S :의이 속성 NBR 및 그룹 항목 함께 독특한 NBR의 정의 범위는 그 속성을 호출 할 수 있습니다. 이 NBR은 [N-1]의 범위에 있어야하며, 항목은 외부로부터 반입 할 때 설정 될 수있다. 모든 항목은 NBR을해야하기 때문에 작업이 수동으로 추가 된 새 항목에 대한 무료 NBR 따기 수 있도록, 값이 사용되는 추적하는 방법이된다.

나는 DynamoDB의와 레디 스를 사용하고 있습니다. 나는 NBR에 DynamoDB의 인덱스를 가질 수 없습니다. 지금까지이 아이디어는 특정 그룹에 사용 된 어떤 번호를 추적하는 레디 스를 사용하는 것입니다 그래서 같은 레디 스 키의 -item-nbrs 나는 모든 사용 NBR 저장할 수 :들과에 논리를 구현 다음 무료 NBR을 찾을 수 있습니다. 사용 된 NBR의 범위의 홀은 허용되지만, 배출 구멍 수를 고려하기 전에 채워 져야한다.

기본적으로 나는 최대 크기 N의 스파 스 배열의 사용되지 않는 인덱스를 찾으려면

빠르게 무료로 NBR을 찾으려면 레디 스에이 정보를 저장하기위한 좋은 구조는 무엇일까요? 내 생각은 지금까지 다음과 같습니다 :

하자 말 N 65536의 크기입니다.

위의 솔루션의 성능이나 다른 이유로, / 더 악화 있습니까? 어쩌면 내가 모르고 해요 것을 레디 스의 일부 영리한 측면을 활용하여 더 나은 / 현명한 방법이 있나요?

편집하다:

케빈의 대답은 다음과 같은 솔루션 (의사 코드) 결과 :

function getFreeNbr() {
  while (true) {
    send "WATCH numbers"
    nbr = send "BITPOS numbers 0"

    if nbr < N
      send "MULTI"
      send "SETBIT numbers $nbr 1"
      if send "EXEC" != NULL
        return nbr
      end if
    else 
      send "UNWATCH numbers"
      return -1
    end if
  }
}

해결법

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

    1.어떻게 값이 사용되었는지 여부에 관계없이 모든 가능한 NBR를 들어, 기록하는 비트 맵을 사용하는 방법에 대해?

    어떻게 값이 사용되었는지 여부에 관계없이 모든 가능한 NBR를 들어, 기록하는 비트 맵을 사용하는 방법에 대해?

    값이 사용 SETBIT을 촬영 한 것을 녹음하려면

    SETBIT key [nbr] 1
    

    무료 NBR 사용 BITPOS를 찾으려면 :

    BITPOS key 0
    

    경쟁 조건을 방지하기 위해 당신은 당신의 GET 앤 세트 원자 있는지 확인하는 것이 좋습니다. [후속 문제의 OP 주소이.]

    이것은 매우 작은 메모리 (65536 개 가능한 값에 대한 8K 바이트)가 필요합니다. BITPOS는 O (N)입니다,하지만 진짜 문제가 될 가능성이 있습니다.

  2. from https://stackoverflow.com/questions/53651878/use-redis-to-generate-unique-id-from-a-limited-range by cc-by-sa and MIT license