Redis系列8:Bitmap实现亿万级数据计算
1 前言
我们在篇 深刻理解高性能Redis的本质 的时候就介绍过Redis的几种基本数据结构,它是基于不同业务场景而设计的:
- 动态字符串(REDIS_STRING):整数(REDIS_ENCODING_INT)、字符串(REDIS_ENCODING_RAW)
- 双端列表(REDIS_ENCODING_LINKEDLIST)
- 压缩列表(REDIS_ENCODING_ZIPLIST)
- 跳跃表(REDIS_ENCODING_SKIPLIST)
- 哈希表(REDIS_HASH)
- 整数集合(REDIS_ENCODING_INTSET)
除了这常见数据类型,还有一些不常用的数据类型,如 BitMap、Geo、HyperLogLog 等等,他们在各自的领域为大数据量的统计,后面我们一一来介绍,学习下他们的实现原理和应用场景。
2 BitMap介绍
BitMap (位图)的底层数据结构使用的是String类型的的 SDS 数据结构来保存。因为一个字节8个bit位,为了有效的将字节的8个bit都利用到位,使用数组模式存储。
并且每个bit都使用二值状态表示,要么0,要么1。
所以,BitMap 是通过一个 bit 位来表示某个元素对应的值或者状态, 它的结构如下,key 对应元素本身;offset即是偏移量,固定整型,一般存数组下表或者唯*一值;value存储的是二值(要么0要么1),一般用来表示状态,如性别、是否登录、是否打卡等。
从上面可以看出这边使用一个字节表示1行,每1行存储8个bit,就是可以存储8个状态位,极大的提高了空间利用。这也是BitMap的优势,我们可以使用很少的字节,存储大量的在线状态、打卡标记等状态信息,非常有效果。
我们可以使用 setbit, getbit, bitcount 等几个相关命令来管理BitMap。语法如下:
SETBIT key offset value
上面说过了,key是元素名称, offset 必须是数值类型,value 只能是 0 或者 1,如果我们存储一个用户的在线状态,用户,代码如下:
//设置在线状态
// $redis->setBit('online', $uid, 1);
$redis->setBit('online', 5, 1);
$redis->setBit('online', 9, 1);
则具体体现为:
byte | bit0 | bit1 | bit2 | bit3 | bit4 | bit5 | bit6 | bit7 |
---|---|---|---|---|---|---|---|---|
buf[0] | 1 | |||||||
buf[1] | 1 |
相关文章