bitfield
BITFIELD
BIT 배열(array)로 숫자 연산(operation)
메모리를 절약하기 위한 데이터 구조로 비트 배열로 숫자를 저장, 연산한다.
예를 들어, 0~15 사이의 숫자를 많이 저장해야 한다면 일반적으로 사용하는
4 bytes(32bits) integer를 사용하지 말고 4 bits integer를 사용하면
메모리를 많이 절약할 수 있다.
- 저장: 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)만 사용 가능합니다.
저장 SET
Example
명령> | bitfield key set u4 0 2 첫 번째 4비트에 2를 저장
|
결과> | 1) (integer) 0 이전 값이 리턴됩니다.
|
명령> | bitfield key set u4 4 4 두 번째 4비트에 4를 저장
|
결과> | 1) (integer) 0
|
명령> | bitfield key set u4 8 6 세 번째 4비트에 6를 저장
|
결과> | 1) (integer) 0
|
조회 GET
Example
명령> | bitfield key get u4 0 첫 번째 4비트 값을 조회
|
결과> | 1) (integer) 2
|
명령> | bitfield key get u4 4
|
결과> | 1) (integer) 4
|
명령> | bitfield key get u4 8
|
결과> | 1) (integer) 6
|
증가/감소 INCRBY
Example
명령> | bitfield key incrby u4 0 1 첫 번째 4비트 값에 1 증가
|
결과> | 1) (integer) 3 결과 값을 보여줍니다.
|
명령> | bitfield key incrby u4 0 2
|
결과> | 1) (integer) 5
|
명령> | bitfield key incrby u4 0 -3 음수 사용 가능
|
결과> | 1) (integer) 2
|
offset #: 아이템 단위로 지정
'#'을 사용해서 offset을 비트 위치가 아닌 아이템 단위로 지정할 수 있습니다.
u4 또는 i4의 경우: 첫 번째 4비트 지정: #0, 두 번째 4비트 지정: #1, 세 번째 4비트 지정:#2 등
u8 또는 i8의 경우: 첫 번째 8비트 지정: #0, 두 번째 8비트 지정: #1, 세 번째 8비트 지정:#2 등
사용자(개발자)가 비트수를 계산할 필요가 없습니다.
Example
명령> | bitfield key set u4 #0 2
|
결과> | 1) (integer) 0
|
명령> | bitfield key get u4 #0
|
결과> | 1) (integer) 2
|
명령> | bitfield key set u4 #0 2
|
결과> | 1) (integer) 4
|
옵션(SET,GET,INCRY)을 중복 사용 가능
Example
명령> | bitfield key set u4 #0 1 set u4 #1 2
|
결과> | 1) (integer) 0
2) (integer) 0
|
명령> | bitfield key set u4 #3 1 get u4 #1
|
결과> | 1) (integer) 0
2) (integer) 2
|
명령> | bitfield key incrby u4 #3 2 set u4 #4 5
|
결과> | 1) (integer) 3
2) (integer) 0
|
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에만 영향을 미칩니다.
WRAP
Example
명령> | bitfield key set u4 #0 15
|
명령> | bitfield key overflow wrap incrby u4 #0 1
|
결과> | 1) (integer) 0 |
명령> | bitfield key set i4 #0 7
|
명령> | bitfield key overflow wrap incrby i4 #0 1
|
결과> | 1) (integer) -8 |
SAT
Example
명령> | bitfield key set u4 #0 10
|
명령> | bitfield key overflow sat incrby u4 #0 10
|
결과> | 1) (integer) 15 |
명령> | bitfield key set i4 #0 5
|
명령> | bitfield key overflow sat incrby i4 #0 5
|
결과> | 1) (integer) 7 |
FAIL
Example
명령> | bitfield key set u4 #0 10
|
명령> | bitfield key overflow fail incrby u4 #0 10
|
결과> | 1) (nil) |
명령> | bitfield key set i4 #0 5
|
명령> | bitfield key overflow fail incrby i4 #0 5
|
결과> | 1) (nil) |
명령문
BITFIELD key [GET type offset] [SET type offset value]
[OVERFLOW WRAP|SAT|FAIL] [INCRBY type offset increment]
- 이 명령은 version 3.2.0 부터 사용할 수 있다.
- 논리적 처리 소요시간은 O(1)입니다.