2014-01-22 3 views
4

Redis는 값이 문자열 인 키 - 값 저장소로 직접 사용할 수 있습니다. 또는 더 복잡한 방법으로 값은 해시 또는 목록과 같은 데이터 구조가 될 수 있습니다. 두 번째 경우가 있고 키 "H"아래에 있다고 가정하면 해시가 있습니다. 항목을 해시에 추가하고 제거 할 수 있습니다. 결국 해시는 비어있을 수 있으며 다시 채울 수 있습니다.Redis에서 빈 데이터 키 유지

데이터 구조에서 마지막 항목 인 해시 "H"를 제거하면 Redis가 어떤 이유로 든 현재 키에서 제거합니다.

예 :

HSET "H" "key1" "value1" 
HSET "H" "key2" "value2" 
HDEL "H" "key1" 
<-- Here, "H" is in the list of current keys, whereby HLEN returns 1 
HDEL "H" "key2" 
<-- Here, for some reason, "H" is not shown among existing keys, 
    not even as an empty hash (HLEN 0) 
HSET "H" "key3" "value3" 
<-- Hash is back in the list of keys 

내 질문은 : 그것은 여전히 ​​지정된 키 ("H"의 (우리의 예를 빈 해시) 값을 보여주는 유지 않도록하는 것이 가능에, 레디 스를 구성하는 것입니다 우리의 예) 비 단순한 빈 데이터 구조로?

답변

7

짧은 답변 : 아니오

레디 스 삽입됩니다 첫 번째 항목 '해시를 생성'과 마지막 항목이 제거 '해시를 제거합니다'. Redis 2.8을 사용하고 있으며 '빈 해시를 허용'할 수있는 옵션이 없습니다.

2

마누가 옳다. 당신은 그렇게 할 방법이 없습니다.

하지만 왜 그렇게하고 싶은지 설명하면 도움이 될 것입니다. 아시다시피 Redis에서는 이전에 존재하지 않더라도 해시에 속성을 설정할 수 있으므로 먼저 해시를 생성하고 속성을 설정할 필요가 없습니다. 이를 염두에두고 비어있는 해시를 유지할 필요가 없습니다. 단지 메모리를 낭비 할뿐입니다.

사용 사례는 무엇입니까?

업데이트 : 사용 사례를 읽은 후 답을 개선하고 있습니다.

"휘발성"해시 문제에 대해 쉽게 할 수 있습니다. KEYS (또는 SCAN) 명령을 실행 한 후에는이 반복에 존재하는 해시의 모든 이름을 포함하는 SET을 작성할 수 있습니다. 이것을 "last_seen_keys"와 같이 호출 할 수 있습니다. 이제 KEYS를 호출 한 후 "current_keys"라고하는 집합을 만듭니다. 이제는 두 세트 사이에서 diff를 실행하기 만하면 마지막 패스에 어떤 키가 있었는지 확인할 수 있습니다. 이러한 키에 대해 statsd의 값을 0으로 설정할 수 있습니다. 그런 다음 "last_seen_keys"SET 삭제하고 "last_seen_keys" "current_keys"SET 이름을 바꿉니다. 그 트릭을해야합니다

+0

내가 원하는 것은 Redis에서 다양한 해시의 길이를 모니터링하는 것입니다. statsd를 사용하고 있지만 문제가되지 않습니다. 요점은 각 분마다, 기존의 모든 Redis 구조 (해시)를 statsd에 덤프하는 것입니다. 해시의 이름은 동적입니다. 그래서 그 이름을 열거 할 수 없습니다. 나는 "KEYS hash - *"를 실행하고 이것들을 반복 할 필요가있다. 그러나 해시가 사라진 경우 statsd에 마지막으로 0이 아닌 값이 있지만 0으로 대체해야합니다. 즉, 빈 해시의 길이는 0입니다. –

+0

직접 명령을 수행 할 수있는 명령은 없지만 사용자는이를 수행 할 수 있습니다. 우선 KEYS 사용을 중단하십시오. 매우 비효율적입니다. redis 2.8부터는 동적 키를 처리해야하는 사용자를 위해 훨씬 효율적이고 특별히 설계된 SCAN을 사용할 수 있습니다. –

+0

방금 ​​제안 된 솔루션을 포함하도록 내 대답이 향상되었습니다. –

관련 문제