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를 기반으로 스터디하며 정리한 내용들입니다.






© 2020.08. by assu10

Powered by assu10