Redis 비트 맵(Bitmap)및 Redis 바 이 너 리 에 대한 질문

질문
SETBIT key offset value
key 에 저 장 된 문자열 값 을 설정 하거나 지정 한 오프셋 의 위치(bit)를 제거 합 니 다.비트 설정 이나 제 거 는 value 매개 변수 에 달 려 있 습 니 다.0 일 수도 있 고 1 일 수도 있 습 니 다.키 가 존재 하지 않 을 때 자동 으로 새 문자열 값 을 생 성 합 니 다.문자열 은 value 를 지정 한 오프셋 에 저장 할 수 있 도록 스 트 레 칭(grown)합 니 다.문자열 값 을 스 트 레 칭 할 때 빈 위 치 를 0 으로 채 웁 니 다.offset 인 자 는 0 보다 크 거나 같 아야 합 니 다.2^32 보다 작 아야 합 니 다.(bit 맵 은 512 MB 이내 로 제 한 됩 니 다.)반환 값 은 원래 저 장 된 위 치 를 지정 합 니 다.
큰 offset 을 사용 하 는 SETBIT 작업 에 있어 메모리 할당 은 Redis 서버 가 막 힐 수 있 습 니 다.구체 적 으로 SETRANGE 명령,warning(경고)부분 을 참고 하 세 요.

127.0.0.1:6379> setbit bit 3 1
(integer) 0
127.0.0.1:6379> getbit bit 0
(integer) 0
127.0.0.1:6379> getbit bit 1
(integer) 0
127.0.0.1:6379> getbit bit 2
(integer) 0
127.0.0.1:6379> getbit bit 3
(integer) 1127.0.0.1:6379> setbit bit 3 0(integer) 1
GETBIT key offset
key 에 대응 하 는 string 이 offset 에 있 는 bit 값 을 되 돌려 줍 니 다.offset 이 문자열 의 길 이 를 초과 할 때 이 문자열 은 0 비트 로 채 워 진 연속 공간 으로 가정 합 니 다.key 가 존재 하지 않 을 때 빈 문자열 이 라 고 생각 하기 때문에 offset 은 항상 범 위 를 초과 하고 value 도 0 비트 로 채 워 진 연속 공간 으로 여 겨 집 니 다.메모리 할당.

127.0.0.1:6379> getbit yhq 5
(integer) 0
127.0.0.1:6379> getbit bit 10
(integer) 0
127.0.0.1:6379> getbit bit 3
(integer) 1
BITCOUNT key [start] [end]
주어진 문자열 에서 1 로 설 정 된 비트 비트 비트 의 수 를 계산 합 니 다.일반적인 상황 에서 주어진 모든 문자열 을 계산 합 니 다.추가 start 나 end 인 자 를 지정 하면 비트*가 아 닌 특정한 위치 에서 만 계산 할 수 있 습 니 다.start 와 end 매개 변수 설정 은 GETRANGE 명령 과 유사 하 며 마이너스 수 치 를 사용 할 수 있 습 니 다.예 를 들 어-1 은 마지막 위 치 를 나타 내 고-2 는 마지막 두 번 째 위 치 를 나타 내 는 것 으로 유추 할 수 있 습 니 다.존재 하지 않 는 key 는 빈 문자열 로 처리 되 기 때문에 존재 하지 않 는 key 를 BITCOUNT 로 조작 한 결과 0 이 되 었 습 니 다.

127.0.0.1:6379> set mykey foobar
OK
127.0.0.1:6379> bitcount youkey
(integer) 0
127.0.0.1:6379> bitcount mykey
(integer) 26
127.0.0.1:6379> bitcount mykey 0 0   # "f" 0110 0110
(integer) 4
127.0.0.1:6379> bitcount mykey 1 1   # "o" 0110 1111
(integer) 6
BITOP operation destkey key [key ...]
바 이 너 리 를 저장 하 는 문자열 키 를 하나 이상 의 비트 로 조작 하고 결 과 를 destkey 에 저장 합 니 다.
operation 은 AND,OR,NOT,XOR 네 가지 작업 중 임의의 것 일 수 있 습 니 다.
  • BITOP AND destkey key[key...]는 하나 이상 의 key 에 대해 논리 적 이 고 결 과 를 destkey 에 저장 합 니 다
  • BITOP OR destkey key[key...]는 하나 이상 의 key 에 대해 논 리 를 구하 거나 결 과 를 destkey 에 저장 합 니 다
  • BITOP XOR destkey key[key...]는 하나 이상 의 key 에 대해 논리 적 차이 점 을 구하 거나 결 과 를 destkey 에 저장 합 니 다
  • BITOP NOT destkey key,주어진 key 에 대해 논리 적 이지 않 고 결 과 를 destkey 에 저장 합 니 다
  • NOT 작업 을 제외 하고 다른 작업 은 하나 이상 의 key 를 입력 으로 받 아들 일 수 있 습 니 다.
    길이 가 다른 문자열 을 처리 합 니 다.BITOP 에서 길이 가 다른 문자열 을 처리 할 때 짧 은 문자열 이 부족 한 부분 은 0 으로 간 주 됩 니 다.빈 키 도 0 을 포함 하 는 문자열 시퀀스 로 간 주 됩 니 다.
    
    127.0.0.1:6379> setbit bit1 0 1
    (integer) 0
    127.0.0.1:6379> setbit bit1 3 1
    (integer) 0
    127.0.0.1:6379> setbit bit2 0 1
    (integer) 0
    127.0.0.1:6379> setbit bit2 1 1
    (integer) 0
    127.0.0.1:6379> setbit bit2 3 1
    (integer) 0
    127.0.0.1:6379> bitop and andbit bit1 bit2
    (integer) 1
    127.0.0.1:6379> getbit andbit 0
    (integer) 1
    127.0.0.1:6379> getbit andbit 1
    (integer) 0
    127.0.0.1:6379> getbit andbit 2
    (integer) 0
    127.0.0.1:6379> getbit andbit 3
    (integer) 1
    BITPOS key bit [start] [end]
    문자열 의 첫 번 째 비트 나 0 으로 설 정 된 비트 를 되 돌려 줍 니 다.빈 문자열 이나 0 바이트 문자열 에서 bit 가 1 인 내용 을 찾 으 면 결 과 는-1 로 돌아 갑 니 다.
    문자열 에서 bit 가 0 이 고 문자열 이 1 만 포함 되 어 있 는 값 을 찾 으 면 문자열 의 맨 오른쪽 에 있 는 첫 번 째 빈 자 리 를 되 돌려 줍 니 다.세 바이트 의 값 이 0xff 인 문자열 이 있다 면 BITPOS key 0 을 명령 하면 0-23 자리 가 1 이기 때문에 24 로 돌아 갑 니 다.기본적으로 우 리 는 문자열 을 오른쪽 에 무수 한 0 이 있다 고 볼 수 있다.단,지정 한 start 와 end 범위 로 지정 한 값 을 찾 을 때 이 범위 내 에 대응 하 는 값 이 없 으 면 결 과 는-1 로 되 돌아 갑 니 다.
    
    127.0.0.1:6379> getbit num 0
    (integer) 0
    127.0.0.1:6379> getbit num 1
    (integer) 0
    127.0.0.1:6379> getbit num 2
    (integer) 1
    127.0.0.1:6379> getbit num 3
    (integer) 1
    127.0.0.1:6379> getbit num 4
    (integer) 0
    127.0.0.1:6379> getbit num 5
    (integer) 0
    127.0.0.1:6379> getbit num 6
    (integer) 1
    127.0.0.1:6379> getbit num 7
    (integer) 0
    127.0.0.1:6379> getbit num 8
    (integer) 0
    127.0.0.1:6379> bitpos num 1
    (integer) 2
    127.0.0.1:6379> bitpos yhqqhh 1
    (integer) -1
    127.0.0.1:6379> bitpos yhqqhh 0
    (integer) 0
    Redis 바 이 너 리 의 문제 1:숫자 는 모두 char 형식 으로 표 시 됩 니 다.
    
    127.0.0.1:6379> set num 2
    OK
    127.0.0.1:6379> bitcount num
    (integer) 3
    Redis 에서 숫자 유형 은 사실 ASCII 형식 으로 나타 나 는데 그것 이 바로 2=>50 이 고 정상 적 인 2(한 바이트 8 개의 바 이 너 리)는 0000010 이 고 bitcount 는 1 이다.그리고 Redis 숫자 는 문자 의'2'이기 때문에'2'[50]는 00110010 이 고 bitcount 는 3 이다.
    Redis 에서 바 이 너 리 는 왼쪽 에서 오른쪽으로(정상적으로 오른쪽 에서 왼쪽으로)
    "2"의 바 이 너 리 는 00110010 이다.
    
    127.0.0.1:6379> getbit num 0
    (integer) 0
    127.0.0.1:6379> getbit num 1
    (integer) 0
    127.0.0.1:6379> getbit num 2
    (integer) 1
    127.0.0.1:6379> getbit num 3
    (integer) 1
    127.0.0.1:6379> getbit num 4
    (integer) 0
    127.0.0.1:6379> getbit num 5
    (integer) 0
    127.0.0.1:6379> getbit num 6
    (integer) 1
    127.0.0.1:6379> getbit num 7
    (integer) 0
    redis 고급 데이터 구조---bitmap
    필드 도입
    저 희 는 정상 적 인 개발 환경 에서 가끔 bool 형 데 이 터 를 액세스 해 야 합 니 다.예 를 들 어 사용자 가 1 년 에 몇 번 이나 출석 했 는 지,설정 1 에 서명 하지 않 았 는 지,설정 0 에 서명 하지 않 았 는 지,365 일 을 기록 해 야 합 니 다.일반적인 key/value 형식 으로 저장 하면 모든 사용 자 는 365 키 쌍 을 차지 해 야 합 니 다.사용자 가 억 에 달 할 때 놀 라 운 저장 공간 이 필요 합 니 다.더군다나 1 년 짜 리.이러한 문 제 를 해결 하기 위해 redis 는 bitmap 의 데이터 구 조 를 제 시 했 습 니 다.그러면 매일 사용자 가 서명 할 때 한 자 리 를 차지 해 야 합 니 다.365 일 은 365 비트,46 바이트 입 니 다.조금 긴 문자열 은 다음 사용자 의 1 년 출석 기록 을 완전히 수용 하고 저장 공간 을 대량으로 절약 할 수 있 습 니 다.비트 맵 의 가장 작은 단 위 는 비트(bit)이 고 모든 bit 의 수 치 는 0 또는 1 에 불과 합 니 다.
    실현 원리
    비트 맵 은 특별한 데이터 구조 가 아 닙 니 다.그의 내용 은 실제 적 으로 일반적인 문자열 입 니 다.즉,byte 배열 입 니 다.우 리 는 일반적인 get/set 을 사용 하여 전체 비트 맵 의 내용 을 직접 가 져 오고 설정 할 수 있 으 며,비트 맵 으로 getbit/setbit 등 을 조작 하여 byte 배열 을 비트 배열 로 볼 수 있 습 니 다.
    기본 용법
    redis 의 비트 배열 은 자동 으로 확장 되 며,어떤 오프셋 위치 가 기 존의 내용 범 위 를 초과 하면 자동 으로 비트 배열 을 0 으로 확장 합 니 다.
    예:
    "h"의 ASCII 코드 값 은:0111000 입 니 다.
    "e"의 ASCII 코드 값 은:01100101 입 니 다.
    "l"의 ASCII 코드 값 은 0110 1100 입 니 다.
    "o"의 ASCII 코드 값 은 0110 1111 입 니 다.
    "he"를 연결 하 는 것 은 01101000000110101 입 니 다.
    즉 1,2,4,9,10,13,15 위 는 1 이다.
    在这里插入图片描述
    이상 의 시범 은'제로 액세스'라 고 할 수 있다.즉,하나의 비트 조작 으로 비트 값 을 설정 하고 하나의 비트 조작 으로 구체 적 인 비트 값 을 얻 는 것 이다.
    또 다른 조작 을'메모리 제로 추출'이 라 고 한다.즉,문자열 을 사용 하여 대량 설정 값 을 조작 하고 한 비트 조작 으로 구체 적 인 비트 값 을 얻는다.
    이상 은 setbit,getbit 의 조작 을 소 개 했 고 redis 는 비트 맵 의 통계 와 검색 명령 도 제공 했다.bitcount,bitpos
    bitcount 는 지정 한 비트 범위 내 1 의 개 수 를 통계 합 니 다.
    bitpos 는 지정 한 범위 내 에 나타 난 첫 번 째 0 또는 1 을 찾 는 데 사 용 됩 니 다.
    
    127.0.0.1:6379> set w hello
    OK
    127.0.0.1:6379> bitcount w    //     1   
    (integer) 21
    127.0.0.1:6379> bitcount w 0 0  //        1   
    (integer) 3
    127.0.0.1:6379> bitcount w 0 1  //        1   
    (integer) 7
    127.0.0.1:6379> bitpos w 0   //   0 
    (integer) 0
    127.0.0.1:6379> bitpos w 1  //   1 
    (integer) 1
    127.0.0.1:6379> bitpos w 1 1 1   //         ,   1 
    (integer) 9
    127.0.0.1:6379> bitpos w 1 2 2   //          ,   1 
    (integer) 17
    127.0.0.1:6379> 
    다음은 마술 지령 bitfield 를 소개 합 니 다:
    주로 setbit/getbit 가 단일 비트 만 조작 할 수 있 는 단점 을 해결 합 니 다.redis 3.2+추가 기능.
    bitfield 는 세 개의 키 명령 이 있 습 니 다.get,set,incrby 는 모두 지정 한 비트 세 션 을 읽 고 쓸 수 있 지만 최대 64 개의 연속 적 인 비트 만 처리 할 수 있 습 니 다.64 비트 를 초과 하면 여러 개의 키 명령 을 사용 해 야 합 니 다.bitfield 는 한 번 에 여러 개의 키 명령 을 수행 할 수 있 습 니 다.
    
    127.0.0.1:6379> set w hello
    OK
    127.0.0.1:6379> bitfield w get u4 0  //        4  ,       (u)
    1) (integer) 6
    127.0.0.1:6379> bitfield w get u3 2  //        3  ,       
    1) (integer) 5
    127.0.0.1:6379> bitfield w get i4 0  //        4  ,         (i)
    1) (integer) 6
    127.0.0.1:6379> bitfield w get i3 2  //        3  ,       
    1) (integer) -3
    127.0.0.1:6379> 
    기호 수 란 얻 은 자릿수 그룹 에서 첫 번 째 위 치 는 기호 위치 이 고 나머지 는 값 이다.첫 번 째 자리 가 1 이면 마이너스 다.
    부호 가 없 는 수 는 마이너스 가 아니 라 기호 가 없 으 며 가 져 온 자릿수 는 모두 값 입 니 다.
    기호 가 있 으 면 최대 64 비트 를 얻 을 수 있 고 기호 가 없 으 면 63 비트 만 얻 을 수 있다.제한 을 초과 하면 redis 는 매개 변수 오 류 를 보고 합 니 다.
    다음은 다 중 명령 어 를 보 여 줍 니 다.
    
    127.0.0.1:6379> bitfield w get u4 0 get u3 2 get i4 0 get i3 2
    1) (integer) 6
    2) (integer) 5
    3) (integer) 6
    4) (integer) -3
    127.0.0.1:6379> 
    다음은 set 서브 명령 을 사용 하여 두 번 째 문자 e 를 a 로 바 꿉 니 다.a 의 ASCII 값 은 97 입 니 다.
    
    127.0.0.1:6379> bitfield w set u8 8 97
    1) (integer) 101
    127.0.0.1:6379> get w
    "hallo"
    127.0.0.1:6379> 
    다음은 세 번 째 키 명령 인 incrby 를 소개 합 니 다.그 는 지 정 된 범위 의 위 치 를 자체 증가 하 는 데 사 용 됩 니 다.자체 증가 작업 인 이상 넘 치 는 상황 이 존재 합 니 다.정 수 를 증가 하면 위로 넘 치고 음 수 를 증가 하면 아래로 넘 칩 니 다.redis 의 기본 처리 방식 은 리 턴 작업 입 니 다.넘 치면 넘 치 는 기호 위 치 를 잃 어 버 립 니 다.8 자리 무기호수 255 이면 1 을 더 하면 넘 쳐 모두 0 으로 변 한다.8 자리 에 127 이 있 으 면 1 을 더 하면 넘 쳐-128 로 변 한다.
    
    127.0.0.1:6379> set w hello
    OK
    127.0.0.1:6379> bitfield w incrby u4 2 1   //       ,     4         +1
    1) (integer) 11
    127.0.0.1:6379> bitfield w incrby u4 2 1 
    1) (integer) 12
    127.0.0.1:6379> bitfield w incrby u4 2 1 
    1) (integer) 13
    127.0.0.1:6379> bitfield w incrby u4 2 1 
    1) (integer) 14
    127.0.0.1:6379> bitfield w incrby u4 2 1 
    1) (integer) 15
    127.0.0.1:6379> bitfield w incrby u4 2 1   //         
    1) (integer) 0
    127.0.0.1:6379> 
    bitfield 명령 은 오 버 플 로 우 정책 서브 명령 을 제공 합 니 다.사용 자 는 오 버 플 로 우 행 위 를 선택 할 수 있 습 니 다.기본 값 은 리 턴(wrap)이 고 실패(fail)-오류 가 실행 되 지 않 고 포화 절단(sat)-범 위 를 초과 하면 최대 치 또는 최소 치 에 머 물 수 있 습 니 다.overflow 명령 은 다음 의 첫 번 째 명령 에 만 영향 을 줍 니 다.이 명령 이 실 행 된 후 넘 치 는 정책 은 기본 값 으로 되 돌아 갑 니 다.
    포화 절단:
    
    127.0.0.1:6379> set w hello
    OK
    127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
    1) (integer) 11
    127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
    1) (integer) 12
    127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
    1) (integer) 13
    127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
    1) (integer) 14
    127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1
    1) (integer) 15
    127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1   //      ,     
    1) (integer) 15
    127.0.0.1:6379> 
    실패 실행 하지 않 음:
    
    127.0.0.1:6379> set w hello
    OK
    127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
    1) (integer) 11
    127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
    1) (integer) 12
    127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
    1) (integer) 13
    127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
    1) (integer) 14
    127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1
    1) (integer) 15
    127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1   //   
    1) (nil)
    127.0.0.1:6379> 
    이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기