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 offsetkey 에 대응 하 는 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 에서 길이 가 다른 문자열 을 처리 할 때 짧 은 문자열 이 부족 한 부분 은 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>
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
그래프 구조를 무상으로 취급할 수 없는 것은 싫기 때문에, redisgraph를 WSL2에 극치고 설치해 보았습니다.제목은 만우절이므로. 그렇다, 역시, 앞으로는 그래프 구조 데이터베이스라고 생각했다. 생각한 것은 몇 년 전인가. 전부터 Neo4j는 시험하고 있지만, 영업 분들로부터 상용 라이센스가 높다고 가르쳐 주었으므로, 전전...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.