Redis - Bit
이 포스트는 Redis 의 데이터 타입 중 하나인 Bit
타입에 대해 알아본다.
1. Bit
- 사용자의 데이터를 0, 1로 표현하며 컴퓨터가 가장 빠르게 해석할 수 있도록 표현하는 구조
$ pwd
/usr/local/opt/redis/bin
$ brew services start redis
==> Successfully started `redis` (label: homebrew.mxcl.redis)
$ redis-cli
127.0.0.1:6379>
1.1. SETBIT
, GETBIT
offset
은 0 부터 시작하고, value
는 0, 1 만 사용 가능하다.
127.0.0.1:6379> help setbit
SETBIT key offset value
summary: Sets or clears the bit at offset in the string value stored at key
since: 2.2.0
group: bitmap
127.0.0.1:6379> help getbit
GETBIT key offset
summary: Returns the bit value at offset in the string value stored at key
since: 2.2.0
group: bitmap
127.0.0.1:6379> setbit bit1 5 1
(integer) 0
127.0.0.1:6379> getbit bit1 0
(integer) 0
127.0.0.1:6379> getbit bit1 5
(integer) 1
A(hex, 16진법) - 0100 0001
C(hex, 16진법) - 0100 0011
127.0.0.1:6379> set bit1 A
OK
127.0.0.1:6379> setbit bit1 6 1
(integer) 0
127.0.0.1:6379> get bit1
"C"
1.2. BITOP
bit 연산(AND, OR, XOR, NOT) 실행하는 명령어이다.
127.0.0.1:6379> help bitop
BITOP operation destkey key [key ...]
summary: Perform bitwise operations between strings
since: 2.6.0
group: bitmap
127.0.0.1:6379> set bit1 A
OK
127.0.0.1:6379> set bit2 B
OK
127.0.0.1:6379> bitop AND bit3 bit1 bit2
(integer) 1
127.0.0.1:6379> get bit3
"@"
127.0.0.1:6379> bitop XOR bit4 bit1 bit2
(integer) 1
127.0.0.1:6379> get bit4
"\x03"
1.3. BITCOUNT
1인 Bit 의 갯수를 조회하는 명령어이다.
start 와 end 는 byte 순서이고, 0 부터 시작한다.
127.0.0.1:6379> help bitcount
BITCOUNT key [start end [BYTE|BIT]]
summary: Count set bits in a string
since: 2.6.0
group: bitmap
A(hex, 16진법) - 0100 0001
B(hex, 16진법) - 0100 0010
C(hex, 16진법) - 0100 0011
127.0.0.1:6379> set bit1 ABC
OK
127.0.0.1:6379> bitcount bit1
(integer) 7
127.0.0.1:6379> bitcount bit1 1 2
(integer) 5
1.4. BITFIELD
Bit Array 이다.
예를 들어 0~15 사이의 숫자를 많이 저장해야 하는 경우 4 bytes (32 bits) 의 integer 대신 4 bits integer 를 사용하면 메모리를 절약할 수 있다.
127.0.0.1:6379> help bitfield
BITFIELD key GET encoding offset|[OVERFLOW WRAP|SAT|FAIL] SET encoding offset value|INCRBY encoding offset increment [GET encoding offset|[OVERFLOW WRAP|SAT|FAIL] SET encoding offset value|INCRBY encoding offset increment ...]
summary: Perform arbitrary bitfield integer operations on strings
since: 3.2.0
group: bitmap
- 저장: bitfield key SET type offset value → bitfield key SET u4 0 1
- 조회: bitfield key GET type offset → GET u4 0
증가/감소: bitfield key INCRBY type offset increment → INCRBY u4 0 1
- type: 숫자 표시 데이터 타입, 부호 있는 숫자 i, 부호 없는 숫자 u, 표시할 숫자가 차지할 비트 수
- 부호 없는(unsigned) 4비트 숫자: u4
- 부호 없는 8비트 숫자: u8
- 부호 있는(signed) 4비트 숫자: i4
- 부호 있는 8비트 숫자: i8
- offset: 비트 위치, u4의 경우 0, 4, 8, …
- value: integer 만 사용 가능
# 첫 번째 4비트에 2 저장
127.0.0.1:6379> bitfield bit1 set u4 0 2
1) (integer) 0 # 이전 값 리턴
# 두 번째 4비트에 4 저장
127.0.0.1:6379> bitfield bit1 set u4 4 4
1) (integer) 0
# 세 번째 4 비트에 6 저장
127.0.0.1:6379> bitfield bit1 set u4 8 6
1) (integer) 0
127.0.0.1:6379> bitfield bit1 get u4 0
1) (integer) 2
127.0.0.1:6379> bitfield bit1 get u4 4
1) (integer) 4
127.0.0.1:6379> bitfield bit1 get u4 8
1) (integer) 6
Overflow, underflow 처리 방식 지정
값이 최댓값을 초과하거나 최솟값 미만으로 되었을 때 값을 처리하는 방식을 지정WRAP: u4 15에 1을 더하면 0이 되고, i4 7에 1을 더하면 -8 (디폴트)
SAT: u4 10에 10을 더하면 15가 되고, i4 5에 5을 더하면 7. 최댓값 또는 최솟값에서 멈춤
FAIL: u4 10에 10을 더하면 (nil), i4 5에 5을 더하면 (nil)명령 위치(순서): Overflow 다음에 있는 incrby 에만 영향을 침
1.5. BITPOS
해당 bit 의 index 를 조회하는 명령어이다.
start, end 는 byte 순서이고, 0 부터 시작한다.
127.0.0.1:6379> help bitpos
BITPOS key bit [start [end [BYTE|BIT]]]
summary: Find first bit set or clear in a string
since: 2.8.7
group: bitmap
127.0.0.1:6379> set bit1 ABC
OK
127.0.0.1:6379> bitpos bit1 0
(integer) 0
127.0.0.1:6379> bitpos bit1 1
(integer) 1
127.0.0.1:6379> bitpos bit1 2
(error) ERR The bit argument must be 1 or 0.
127.0.0.1:6379> bitpos bit1 1 2
(integer) 17
참고 사이트 & 함께 보면 좋은 사이트
본 포스트는 주종면 저자의 빅데이터 저장 및 분석을 위한 NoSQL & Redis를 기반으로 스터디하며 정리한 내용들입니다.
- 빅데이터 저장 및 분석을 위한 NoSQL & Redis
- 빅데이터 저장 및 분석을 위한 NoSQL & Redis - 실습파일
- https://redis.io/commands
- https://redis.io/commands - bitmap
- Redis Gate - Bit