복붙노트

[REDIS] 누군가가 레디 스 SETBIT 명령을 설명 할 수 있습니까?

REDIS

누군가가 레디 스 SETBIT 명령을 설명 할 수 있습니까?

> setbit mykey 1 1
> setbit mykey 7 1

내가 문자열 값 1 "의 mykey"에 7 저장할 때, 무엇을 정확히 레디 스에 저장된? 그리고 어떻게 getbit 내부 레디 스를 작동?

사람이 루프이 값 내부의 비트를 시도 하는가? 가능, 나는 bitcount 나에게 2 번을 줄 것이다 알고 있지만, 나는 또한 그것에서 정확한 문자열 값 1과 7 싶어?

--

나는 출력을 읽을 얼랑 레디 스 클라이언트를 사용하여 몇 가지 실험을하고.

> setbit mykey 1 1

얼랑 출력 :

<<"@">>

그 때 나는이 항목을 삭제 :

> del mykey

나는 2 4 8을 상쇄하기 위해 같은 일을, 당신은 여기 매핑을 볼 수 있습니다 :

When offset is 1, the output is <<"@">>;
When offset is 2, the output is <<" ">>;
When offset is 4, the output is <<"\b">>;
When offset is 8, the output is <<0,128>>;

솔직히, 나는 더 많은 지금 혼란 스러워요.

또는 사람이 "bitops.c"를 설명 할 수

- 업데이트 ---

내가 질문을 더 명확하게하기 위해이 작업을 수행 할 수 아마 그래서 나는 이유를 언급해야한다. 우리 모두는 온라인 사용자를 저장하는 데 사용할 비트 맵에 멋진 알고 있습니다. 내가 뭘하려고 저장 레디 스 것과 온라인 정확히 사용자 ID를 얻을 수있다.

그냥 레디 스에서 오프셋을 추출하는 빠른 버전을 완료했다. 그것을 개선 주시기 바랍니다.

해결법

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

    1.이름에서 알 수 있듯이, SETBIT는 비트 연산을 수행 할 수 있습니다 - 주어진 비트가 지정된 키를 들면, 오프셋 (offset) 즉, 0 또는 1로 지정된 비트를 설정합니다.

    이름에서 알 수 있듯이, SETBIT는 비트 연산을 수행 할 수 있습니다 - 주어진 비트가 지정된 키를 들면, 오프셋 (offset) 즉, 0 또는 1로 지정된 비트를 설정합니다.

    무엇 이해하는 것이 중요한 것은 결과가 항상 인쇄 가능한 문자가 포함되어 있다는 것입니다. 레디 스의 CLI 출력 형식을 사용자 정의 기능 sdscatrepr를 사용하는 이유입니다 :

    그 존재는 간단한 예제와 함께하자 시작했다. 당신이 16 진수를 고려하는 경우 0x7F의 (= 127) 8 비트의 이진 표현입니다 :

    pos: 0 1 2 3 4 5 6 7
    bit: 0 1 1 1 1 1 1 1
         ^             ^
         |             |
         MSB           LSB
    

    당신은 일반적으로 7 LSB 0이 MSB 오프셋 및 오프셋 염두에두고,이 값을 저장하기 위해 SETBIT를 사용할 수 있습니다 :

    redis> SETBIT myval 0 0
    (integer) 0
    redis> SETBIT myval 1 1
    (integer) 0
    redis> SETBIT myval 2 1
    (integer) 0
    redis> SETBIT myval 3 1
    (integer) 0
    redis> SETBIT myval 4 1
    (integer) 0
    redis> SETBIT myval 5 1
    (integer) 0
    redis> SETBIT myval 6 1
    (integer) 0
    redis> SETBIT myval 7 1
    (integer) 0
    

    은 값이 경우 검사 수 :

    redis> GET myval
    "\x7f"
    

    이제 어떻게 멀티 바이트됩니까? 하자 당신이 ASCII에서 문자 R에 해당하는 0x52 (= 82)를 저장하고 싶은 말은. 8 비트 표현의 비트 위치와 01,010,010 (8, 9, ..., 15) 우리가 오른쪽 첫 번째 값 후 저장할 보낸 사람 :

    redis> SETBIT myval 8 0
    (integer) 0
    redis> SETBIT myval 9 1
    (integer) 0
    redis> SETBIT myval 10 0
    (integer) 0
    redis> SETBIT myval 11 1
    (integer) 0
    redis> SETBIT myval 12 0
    (integer) 0
    redis> SETBIT myval 13 0
    (integer) 0
    redis> SETBIT myval 14 1
    (integer) 0
    redis> SETBIT myval 15 0
    (integer) 0
    

    그리고 당신은 얻을 :

    redis> GET myval
    "\x7fR"
    

    여기 레디 스 CLI는 인쇄 가능한 문자 R.를 나타낼 수있다

    이것은 헥스 65 0x41을 같다 01,000,001에 대응한다. 이 ASCII 문자 A로하고 그래서 해당합니다

    redis> SETBIT mykey 1 1
    (integer) 0
    redis> SETBIT mykey 7 1
    (integer) 0
    

    제공합니다 :

    redis> GET mykey
    "A"
    

    그것은 단순히 지정된 위치에있는 비트의 값을 반환합니다. 여기:

    redis> GETBIT mykey 1
    (integer) 1
    

    그러나 0 (기본값 0) 이렇게 설정되어 있지 않은 비트 :

    redis> GETBIT mykey 0
    (integer) 0
    
  2. ==============================

    2.u는 http://redis.io에 정확히 세부 정보를 볼 수 있습니다

    u는 http://redis.io에 정확히 세부 정보를 볼 수 있습니다

    GETBIT 키 오프셋

    키에 저장된 문자열 값의 오프셋 (offset)의 비트 값을 돌려줍니다. 문자열 길이 이상으로 오프셋되면, 문자열은 0 비트를 갖는 연속 공간으로 간주된다. 키는, 비어있는 스트링으로 간주 존재 때문에 상쇄되지 않을 때 범위에서 언제나 그 값은 0 비트를 갖는 연속 공간으로 간주된다.

    예 :

    redis> SETBIT mykey 7 1
    (integer) 0
    redis> GETBIT mykey 0
    (integer) 0
    redis> GETBIT mykey 7
    (integer) 1
    redis> GETBIT mykey 100
    (integer) 0
    redis> 
    
  3. from https://stackoverflow.com/questions/20673131/can-someone-explain-redis-setbit-command by cc-by-sa and MIT license