Redis 학습 및 응용 (1) 비트 맵

6333 단어
비트 맵 이란 무엇 인가
비트 맵 (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
역할: 여러 키 를 위치 조작 합 니 다.OPoperation 의 약자 이다.용법: 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 로 설정 합 니 다.
    예 를 들 면:
  • 모 앱 이 출시 된 지 100 일 째 인 데 만약 에 사용자 A 가 해당 날 에 한 번 출시 된다 면.
  • SETBIT A 100 1 
    
  • 모 앱 이 출시 된 지 101 일 째, 사용자 A 가 출시 됐다.
  • SETBIT A 101 1 
    
  • 가입자 A 의 총 접속 횟수 를 집계 한다.
  • 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 로 설정 합 니 다.
    참고 자료
  • redis 를 사용 하여 좋아요 기능 을 실현 하 는 몇 가지 사고
  • Redis 에서 bitmap 의 묘 용
  • When would you use a long, string ID instead of a simple integer
  • 비트 연산 자
  • Bitmap 의 비밀
  • redis 는 bitmap 를 사용 하여 사이트 활성 화 된 사용자 의 통 계 를 실현 합 니 다.
  • 모델: bitmap 를 사용 하여 사용자 의 온라인 횟수 통계 실현
  • 위 키 백과, 우리 모두의 백과사전.
  • 보면 시리즈 의 상세 한 해석 redis 의 bitmap 가 억 급 프로젝트 에서 의 응용
  • 을 알 수 있다.

    좋은 웹페이지 즐겨찾기