2016-06-27 2 views
0

redis-py 및 Redis 목록 데이터 형식을 사용하여 스택 데이터 구조를 구현하고 있습니다. 해당 목록 데이터 형식이 비어있는 경우 대/소문자를 처리하는 방법이 명확하지 않습니다. 기본 Redis 동작은 목록이 비어지면 관련 키가 삭제된다는 것입니다. 빈리스트 케이스는 예를 들어, 파이썬 끝에서 스택 데이터 구조의 모든 요소를 ​​팝하거나 지울 때 Redis에서 히트됩니다. 기본적으로, 내 설정은 Redis 목록에서 작업을 호출하는 코드에 스택 객체가 있다는 것입니다. 예를 들어 스택 객체의 클라이언트가 stack.pop()을 수행하면 스택 객체는 redis-py를 사용하여 Redis의 해당 목록에서 BRPOP을 호출합니다. 또한, 내 설정에서 스택 개체는 Redis의 관련 목록의 키인 키 특성을가집니다.Redis를 사용하여 영구 스택 데이터 구조 구현

나는 약이 가능한 솔루션 지금까지 생각 :

  1. 완전히 레디 스 목록을 비우하지 마십시오. 목록에 하나 이상의 요소를 유지하십시오. Redis 목록에 요소가 하나만 있으면 클라이언트의 관점에서 스택이 비어 있습니다. 이 접근 방식은 효과적이지만, 푸시/튀어 오르는 요소의 수를 추적해야하기 때문에 주로 좋아하지 않습니다.

  2. 목록이 비어 있고 관련 키가 삭제 된 경우. 후속 푸시에서 Redis에서 새 목록을 만듭니다. 이 접근법은 또한 효과가 있지만 여기에 추가 된 복잡성은 다른 누군가가 k를 만들었는지 확신 할 수 없다는 것입니다. 즉, 스택 객체의 키와 동일한 키를 사용하여 Redis에서 쌍을 만듭니다.

그래서 기본적으로 위의 두 가지 접근 방식에서 요구되는 부기를 포함하지 않는 빈 목록이있는 키를 보관할 방법을 찾고 있습니다. 감사.

+0

두 번째 솔루션이 가장 적합합니다. 나는 그 어떤 문제도 보지 못한다. 당신은 목록을 만들 필요가 없습니다 그냥 Lpush하거나 서두가 만들어집니다. 비슷하게 pop에서 (nil)을 얻으면 스택은 비어 있고 그것을 app logic에서 처리한다. 열쇠 수명을 추적해서 당신이 의미하는 바를 이해하지 못합니다. 또한 redis는 기본적으로 SQL 데이터베이스가 아니므로 입력 한 키를 제어 할 수 있어야합니다. 다른 키와 동일한 키를 만드는 것을 제어 할 수 없다고 말할 수는 없습니다. –

+0

@KarthikeyanGopall 기반 온라인에서 다른 리소스를 사용하는 경우 키 충돌을 피하기 위해 일종의 명명 규칙이 필요합니다. 어떤 키가 들어가는지를 제어하는 ​​것은 수동으로 또는 자동으로 프로세스의 결과물을 넣는 것입니다. Redis가 당신에게이 시설을 제공하는 것 같지 않지만 Redis 외부에서 처리해야합니다. 또한 내 질문에 추적 키 수명 비트가 모호하므로 편집했습니다. – Waqas

답변

1

두 번째 솔루션이 가장 적합합니다.

네, 명명 규칙을 유지해야합니다. 이것은 SQL 데이터베이스가 없거나 키 값 저장소에 대해 매우 기본적인 것입니다. 당신은 당신이 넣은 키에 대한 통제권을 가져야 만합니다. 당신이 그 통제권을 갖고 있지 않다면 어떤 기간 동안 어떤 목적을 위해 어떤 열쇠가 사용되는지 알지 못합니다. 같은를 달성하기 위해, 당신은 당신이에 넣어 모든 키에 의미있는 문자열을 접두사 수 있습니다. 예를 들어

, 나는이

hmset ACTIONS_user1 a 10 b 20 ... 
hmset VIEWS_user1 home_page 4 login 10 ... 
hmset ALERTS_user1 daily 5 hourly 12 ... 

같이 할 것입니다 단일 사용자 USER1에 대한 3 HashMaps을 저장하려면 위의 예제에서 user1은 앱 로직에 의해 동적으로 생성되고 그 키에 포함 된 의미있는 문자열을 추가합니다.

이렇게하면 입력 한 키를 항상 제어 할 수 있으므로 키 충돌이 발생하지 않습니다.

희망이 도움이됩니다.

+0

내 주요 관심사가 특정 키와 관련된 데이터를 재정의/무효화했습니다. 나는 당신의 제안에 따라 갔고 두 번째 접근법을 선택했습니다. 충돌을 피하는 것에 대한 복잡성은 내 코드의 외부에서 처리되어야합니다. – Waqas

+0

실용적인 조언을 벗어나지 만 완성을 위해 (키에 대한 제어가 없다고 가정) 두 이론적 인 점 : 1) 이론적으로 말해서 서로 다른 응용 프로그램이 동일한 HMSET 명령을 발행 할 수있는 경우가 발생할 수 있습니다. 있을 법하지는 않지만 불가능하지는 않다. 2) 두 개의 서로 다른 키가 동일한 버킷에서 충돌하여 충돌을 일으킬 수 있지만 Redis는이를 사용자에게 투명하게 만듭니다. – Waqas