이 글은 비트맵 문제를 주로 소개하는 Redis에 대한 관련 지식을 제공합니다. Redis는 비트맵 데이터 구조를 제공합니다. 비트맵 데이터 구조는 실제로는 새로운 것이 아닙니다. 하지만 그 안의 내용은 0이나 1만 될 수 있습니다. 모두에게 도움이 되기를 바랍니다.
추천 학습: Redis 비디오 튜토리얼
사용자가 1년 동안 매일 시스템에 로그인하는지 여부를 기록해야 하는 경우 이 요구 사항을 어떻게 완료해야 합니까? KV 스토리지를 사용하는 경우 각 사용자는 365개의 레코드를 기록해야 하며 사용자 수가 수억 명에 도달하면 필요한 저장 공간이 엄청납니다.
Redis는 비트맵 데이터 구조를 제공합니다. 각 사용자의 일일 로그인 기록은 1비트만 차지하므로 저장하는 데 46바이트만 필요하므로 저장 공간이 크게 절약됩니다.
사실 비트맵 데이터 구조는 전혀 새로운 것이 아닙니다. 단순히 배열이라고 생각하면 되지만, 그 안의 내용은 0 또는 1(이진 비트 배열)만 될 수 있습니다.
Redis는 SETBIT
, GETBIT
, BITCOUNT
, BITOP
4가지를 제공합니다. 명령은 이진 비트 배열을 처리하는 데 사용됩니다. SETBIT
、GETBIT
、BITCOUNT
、BITOP
四个常用命令用于处理二进制位数组。
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
如下展示了一个用 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[0]
实际保存了位数组buf[1]
为自动追加的
위 내용은 한 기사로 Redis의 비트맵 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!