Redis 학습 및 응용 (1) 비트 맵
비트 맵 (Bitmap) 은 하나의
bit
을 통 해 특정한 요소 가 대응 하 는 값 이나 상 태 를 나타 낸다.그것 은 결코 새로운 데이터 구조 가 아니다.그것 의 내용 은 사실 일반적인 문자열 이다.우 리 는 get/set
을 통 해 비트 맵 의 내용 을 얻 을 수 있 고 getbit/setbit
조작 bit
값 (0 또는 1) 을 사용 할 수 있다.Bit
즉 비트 는 현재 컴퓨터 에서 데이터 가 가장 작은 단위 이다.8 비트, 1 바이트.Bit 의 값 은 0 이거 나 1 이다.Bit 는 컴퓨터 에서 가장 작은 단위 이기 때문에 그것 을 사용 하여 저장 하면 공간 을 매우 절약 할 수 있다.데이터 양 이 많은 장면 에 특히 적합 하 다.예 를 들 어 매일 활발 한 사용 자 를 통계 하고 매달 카드 수 를 집계 하 는 등 통계 장면 이다.상용 명령 소개
1)SETBIT
역할: 특정한 KEY 의 특정한 위치 에 값 을 설정 하 는 방법:
SETBIT key offset value
반환 값: 원래 저 장 된 위치redis> SETBIT bit 10086 1
(integer) 0
2)GETBIT
역할: 특정한 KEY 의 값 을 가 져 오 는 용법: GETBIT key offset 반환 값: 0 또는 1.offset 이 문자열 값 보다 길이 가 크 거나 키 가 존재 하지 않 을 때 0 을 되 돌려 줍 니 다.
redis> SETBIT bit 10086 1
(integer) 0
redis> GETBIT bit 10086
(integer) 1
3)BITOP
역할: 여러 키 를 위치 조작 합 니 다.
OP
은 operation
의 약자 이다.용법: BITOP operation destkey key 1 key 2 [key...] 매개 변수 설명: operation 표시 비트 연산 자.모두 네 가지 조작 이 있 습 니 다. 다음 표를 보십시오.destkey 는 연산 결과 에 저 장 된 값 key 1, key 2, key 3 는 연산 을 하 는 key 를 표시 합 니 다.operation
묘사 하 다.
AND
논리 적 통합
OR
논리
NOT
논리 비
XOR
논리
반환 값: destkey 에 저 장 된 문자열 의 길 이 는 입력 key 에서 가장 긴 문자열 의 길이 와 같 습 니 다.
redis> SETBIT bits-1 0 1 # bits-1 = 1001
(integer) 0
redis> SETBIT bits-1 3 1
(integer) 0
redis> SETBIT bits-2 0 1 # bits-2 = 1011
(integer) 0
redis> SETBIT bits-2 1 1
(integer) 0
redis> SETBIT bits-2 3 1
(integer) 0
redis> BITOP AND and-result bits-1 bits-2
(integer) 1
redis> GETBIT and-result 0 # and-result = 1001
(integer) 1
redis> GETBIT and-result 1
(integer) 0
redis> GETBIT and-result 2
(integer) 0
redis> GETBIT and-result 3
(integer) 1
4)BITCOUNT
역할: 주어진 문자열 의 비트 가 1 인 숫자 를 계산 합 니 다. BITCOUNT key [start] [end] 주의: 이 곳 의 [start] [end] 는 바이트 의 시작 과 끝 위치 이 며, 오프셋 이 아 닌 위치 반환 값: 1 로 설 정 된 비트 의 수 입 니 다.존재 하지 않 는 key 나 빈 문자열, 값 은 0 입 니 다.
redis> SETBIT tian 0 1
(integer) 0
redis> BITCOUNT tian
(integer) 1
redis> SETBIT tian 2 1
(integer) 0
redis> BITCOUNT tian
(integer) 2
5)BITPOS
사용법: 키 의 첫 번 째 위 치 를 0 또는 1 로 설정 한 위치 로 가 져 옵 니 다. BITPOS key bit [start] [end] 반환 값: 0 또는 1 로 설 정 된 첫 번 째 위 치 를 되 돌려 줍 니 다.
redis> SET test_str 'youthcity'
OK
# 1
redis> BITPOS test_str 1
(integer) 1
# 0
redis> BITPOS test_str 0
(integer) 0
redis> BITPOS test_1 1 # , -1
(integer) -1
6) 마술 지령 BITFIELD
역할: 한 번 에 여러 비트 범 위 를 조작 합 니 다.bitfield 는 get / set / incrby 세 개의 하위 명령 이 있 습 니 다.모든 명령 은 지정 한 세 션 을 조작 할 수 있다.용법: BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP | SAT | FAIL] 반환 값: 하나의 배열 을 되 돌려 줍 니 다. 배열 의 모든 요 소 는 해당 작업 의 실행 결과 입 니 다.
# 1 4 , 5( )
redis> BITFIELD key SET i4 0 5
1) (integer) 0
# 1 4 ,
redis> BITFIELD key GET i4 0
1) (integer) 5
# 1 4 ,
# 5 4 , 6,
# 5 4 , 1,
redis> BITFIELD key GET i4 0 SET u4 4 6 INCRBY u4 4 1
1) (integer) 5
2) (integer) 0
3) (integer) 7
BITFIELD 는 세 가지 넘 침 전략 도 제공 했다.
WRAP
(wrap around, 회전).하나의 i8 의 정수, 값 은 127 이 고 1 이 증가 하면 값 이 - 128 로 변 할 수 있 습 니 다.SAT
(saturation arithmetic, 포화 계산).하나의 i8 의 정수, 값 은 120 이 고 10 증가 결 과 는 127 (i8 유형 이 저장 할 수 있 는 최대 정수) 로 변 한다.FAIL
。 넘 침 이 발생 했 을 때 작업 이 실 패 했 습 니 다.빈 값 을 되 돌려 계산 이 실행 되 지 않 았 음 을 표시 합 니 다.redis> BITFIELD tian_key SET i8 0 127 OVERFLOW WRAP INCRBY i8 0 1
1) (integer) 0
2) (integer) -128
redis> BITFIELD tian_key_2 SET i8 0 120 OVERFLOW SAT INCRBY i8 0 10
1) (integer) 0
2) (integer) 127
redis> BITFIELD tian_key_3 SET i8 0 127 OVERFLOW FAIL INCRBY i8 0 1
1) (integer) 0
2) (nil)
응용 장면
1) 접속 횟수 통계
실현 원리: 사용자 가 어느 날 접속 할 때마다 우 리 는
SETBIT
을 사용 하여 사용자 이름 key
으로 그날 대표 하 는 사이트 의 접속 일 을 offset
매개 변수 로 하고 이 offset
의 위 치 를 1
로 설정 합 니 다.예 를 들 면:
SETBIT A 100 1
SETBIT A 101 1
BITCOUNT A
2) 사용자 서명
사용자 의 접속 횟수 를 통계 하 는 원리 와 유사 하 다.
원리: 사용자 ID 를 KEY 로 하고 현재 시간 거리 시작 시간의 차 이 를 오프셋 으로 하 며 사용자 가 한 번 서명 하면 위 치 를
1
로 합 니 다.마지막 bitcount
KEY, 사용자 의 총 출석 횟수 를 획득 합 니 다.const start_date = '20180801';
const end_date = '20180830';
const offset = moment(start_date).unix() - moment(end_date).unix();
redis.setBit('user_id_2018', offset, 1);
//
redis.bitCount('user_id_2018');
3) 활성 사용자 통계
수요: 하루 또는 며칠 연속, 활성 화 된 사용자 수 방안 통계: 사용자 가 접속 하면 날 짜 를 KEY 로 하고 사용자 userid 는 편 이 량 (ID 가 정수 가 아니라면 ID hash 를 유일한 ID 로 변경), 설정 위치
1
redis.setBit('')
const status = 1;
const user_id = 100;
redis.setBit('active_20180820', user_id, status);
redis.setBit('active_20180821', user_id, status);
// 20180820 20180821 , 。 KEY—— dest_201808_20_21
redis.bitOp('AND', 'dest_201808_20_21', 'active_20180820', 'active_20180821');
redis.bitCount('dest_201808_20_21');
4) 사용자 온라인 상태
수요: 사용자 가 온라인 인지 인 터 페 이 스 를 제공 합 니 다.방안: 사용자 의 온라인 상 태 를 저장 하기 위해
bitmap
를 사용 합 니 다.KEY 를 사용 합 니 다. 사용자 가 온라인 에 있 으 면 사용자 ID 위치 오프셋 으로 위 치 를 1
로 설정 합 니 다.온라인 이 아 닌 경우 0
로 설정 합 니 다.참고 자료
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.