bitfield
BITFIELD
레디스 개발자 교육 신청 |
레디스 정기점검/기술지원 Redis Technical Support |
레디스 엔터프라이즈 서버 Redis Enterprise Server |
---|
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)입니다.
<< BITCOUNT | BITFIELD | BITPOS >> |
---|
Email
답글이 올라오면 이메일로 알려드리겠습니다.