>  기사  >  데이터 베이스  >  한 기사로 Redis의 비트맵 이해하기

한 기사로 Redis의 비트맵 이해하기

WBOY
WBOY앞으로
2022-04-27 19:48:015466검색

이 글은 비트맵 문제를 주로 소개하는 Redis에 대한 관련 지식을 제공합니다. Redis는 비트맵 데이터 구조를 제공합니다. 비트맵 데이터 구조는 실제로는 새로운 것이 아닙니다. 하지만 그 안의 내용은 0이나 1만 될 수 있습니다. 모두에게 도움이 되기를 바랍니다.

한 기사로 Redis의 비트맵 이해하기

추천 학습: Redis 비디오 튜토리얼

1. 비트맵 소개

사용자가 1년 동안 매일 시스템에 로그인하는지 여부를 기록해야 하는 경우 이 요구 사항을 어떻게 완료해야 합니까? KV 스토리지를 사용하는 경우 각 사용자는 365개의 레코드를 기록해야 하며 사용자 수가 수억 명에 도달하면 필요한 저장 공간이 엄청납니다.

Redis는 비트맵 데이터 구조를 제공합니다. 각 사용자의 일일 로그인 기록은 1비트만 차지하므로 저장하는 데 46바이트만 필요하므로 저장 공간이 크게 절약됩니다.

사실 비트맵 데이터 구조는 전혀 새로운 것이 아닙니다. 단순히 배열이라고 생각하면 되지만, 그 안의 내용은 0 또는 1(이진 비트 배열)만 될 수 있습니다.

2. 명령 연습

Redis는 SETBIT, GETBIT, BITCOUNT, BITOP 4가지를 제공합니다. 명령은 이진 비트 배열을 처리하는 데 사용됩니다. SETBITGETBITBITCOUNTBITOP四个常用命令用于处理二进制位数组。

  • SETBIT:为位数组指定偏移量上的二进制位设置值,偏移量从0开始计数,二进制位的值只能为0或1。返回原位置值。
  • GETBIT:获取指定偏移量上二进制位的值。
  • BITCOUNT:统计位数组中值为1的二进制位数量。
  • BITOP:对多个位数组进行按位与、或、异或运算。
127.0.0.1:6379> SETBIT first 0 1    # 0000 0001
(integer) 0
127.0.0.1:6379> SETBIT first 3 1    # 0000 1001
(integer) 0
127.0.0.1:6379> SETBIT first 0 0    # 0000 1000
(integer) 1

127.0.0.1:6379> GETBIT first 0
(integer) 0
127.0.0.1:6379> GETBIT first 3
(integer) 1

127.0.0.1:6379> BITCOUNT first      # 0000 1000
(integer) 1
127.0.0.1:6379> SETBIT first 0 1    # 0000 1001
(integer) 0
127.0.0.1:6379> BITCOUNT first      # 0000 1001
(integer) 2
127.0.0.1:6379> SETBIT first 1 1    # 0000 1011
(integer) 0
127.0.0.1:6379> BITCOUNT first      # 0000 1011
(integer) 3

127.0.0.1:6379> SETBIT x 3 1        
(integer) 0
127.0.0.1:6379> SETBIT x 1 1        
(integer) 0
127.0.0.1:6379> SETBIT x 0 1        # 0000 1011
(integer) 0
127.0.0.1:6379> SETBIT y 2 1        
(integer) 0
127.0.0.1:6379> SETBIT y 1 1        # 0000 0110
(integer) 0
127.0.0.1:6379> SETBIT z 2 1        
(integer) 0
127.0.0.1:6379> SETBIT z 0 1        # 0000 0101
(integer) 0

127.0.0.1:6379> BITOP AND andRes x y z    #0000 0000
(integer) 1
127.0.0.1:6379> BITOP OR orRes x y z      #0000 1111
(integer) 1
127.0.0.1:6379> BITOP XOR x y z           #0000 1000
(integer) 1

# 对给定的位数组进行按位取反
127.0.0.1:6379> SETBIT value 0 1
(integer) 0
127.0.0.1:6379> SETBIT value 3 1            #0000 1001
(integer) 0
127.0.0.1:6379> BITOP NOT notValue value    #1111 0110
(integer) 1

3.BitMap源码分析

3.1 数据结构

如下展示了一个用 SDS 表示的一字节(8位)长的位图:

扩展:Redis 中的每个对象都是有一个 redisObject 结构表示的。

typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
// 引用计数
int refcount;
// 执行底层实现的数据结构的指针
void *ptr;
} robj;
  • type 的值为 REDIS_STRING表示这是一个字符串对象
  • sdshdr.len 的值为1表示这个SDS保存了一个1字节大小的位数组
  • buf数组中的buf[0]实际保存了位数组
  • buf数组中的buf[1]为自动追加的

위 내용은 한 기사로 Redis의 비트맵 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제