TairRoaring是基于Tair引擎的Roaring Bitmap实现,本文介绍TairRoaring及其支持的命令。
TairRoaring简介
Bitmap(又名Bitset)是一种常用的数据结构,使用少量的存储空间来实现海量数据的查询优化。尽管Bitmap相比常规基于Hash结构的实现节省了大量内存空间,但是常规Bitmap对于稀疏场景下的数据存储仍不够友好,因此有了各种压缩Bitmap的实现(Compressed bitmap),Roaring Bitmap就是业界公认的一种更高效和均衡的Bitmap压缩存储的实现。
TairRoaring在此基础上完成大量优化:
通过2层索引和多种动态容器(Container),平衡了多种场景下性能和空间效率。
使用了包括SIMD instructions、Vectorization、PopCnt算法等多种工程优化,提升了计算效率,实现了高效的时空效率。
基于Tair提供的强大计算性能和极高的稳定性,为用户场景保驾护航。
典型场景
适用于直播、音乐、电商等行业,通过用户多维度标签,进行个性化推荐、精准营销等场景。
发布记录
V2版本Breaking Change公告:
TR.RANGEINTARRAY:V1版本的TR.RANGEINTARRAY命令名称修改为V2版本的TR.RANGE,其内容无变化。
TR.SETRANGE:V1版本的TR.SETRANGE命令的返回值为
OK
,V2版本返回值为成功设置bit值为1的数量,其他内容无变化。
2021年9月13日发布TairRoaring V1版本,请将小版本升级至1.7.20及以上。
2022年3月11日发布TairRoaring V2版本,请将小版本升级至1.7.27及以上。
该版本优化了部分命令的实现,提升了性能。新增TR.SETBITS、TR.CLEARBITS等9个命令,向前兼容扩展2个命令,更新1个命令,更名1个命令。
2022年4月20日发布TairRoaring V2.2版本,请将小版本升级至1.8.1及以上。
该版本新增TR.JACCARD、TR.CONTAINS、TR.RANK命令,更新部分命令在key不存在时的返回错误(移除了
ERR key not found
)。
最佳实践
前提条件
注意事项
操作对象为Tair实例中的TairRoaring数据。
命令列表
类型 | 命令 | 语法 | 说明 | 版本变更 |
写操作 |
| 设置Roaring Bitmap中指定偏移量(offset)的bit值(1或者0),并返回该bit位之前的值,Roaring Bitmap的偏移量(offset)从0开始。 | -(表示未更新) | |
| 设置Roaring Bitmap中指定偏移量(offset)的bit值为1,支持传入多个值。 | V2新增 | ||
| 设置Roaring Bitmap中指定偏移量(offset)的bit值为0,若原值为0则不操作,支持传入多个值。 | V2新增 | ||
| 设置Roaring Bitmap中指定区间(偏移量)的bit值为1。 | V2更新,更新返回值为成功设置bit值为1的数量。 | ||
| 将由连续的0或1组成的bit数组(bitarray)插入到Roaring Bitmap中指定偏移量(offset)之后的位置,并覆盖原有数据。 | V2新增 | ||
| 对Roaring Bitmap中指定区间(偏移量)的bit值执行位反转(1反转为0;0反转为1)。若指定key不存在,则自动创建目标key,并以空Roaring Bitmap对指定区间的bit值执行位反转。 | V2新增 | ||
| 设置Roaring Bitmap中指定偏移量(offset)的bit值为1,支持传入多个值。 说明 在TairRoaring V2版本中,建议使用TR.SETBITS代替该命令。 | - | ||
| 根据传入的整型数组,创建对应的Roaring Bitmap,该命令会重置(覆盖)已存在的Roaring Bitmap对象。 说明 在TairRoaring V2版本中,建议使用TR.SETBITS代替该命令。 | - | ||
| 根据传入的bit(由0和1组成的字符串),创建对应的Roaring Bitmap。若目标Key已存在则会重置(覆盖)原有数据。 说明 在TairRoaring V2版本中,建议使用TR.APPENDBITARRAY代替该命令。 | - | ||
| 对Roaring Bitmap执行集合运算操作,计算结果存储在destkey中,支持AND、OR、XOR、NOT和DIFF集合运算类型。 说明 该命令在集群架构实例中不支持执行跨Slot的Key。 | - | ||
| 对Roaring Bitmap执行集合运算操作,支持AND、OR、XOR、NOT和DIFF集合运算类型。 说明 该命令在集群架构实例中不支持执行跨Slot的Key。 | V2新增 | ||
| 优化Roaring Bitmap的存储空间。如果目标对象相对较大,且创建后以只读操作为主,可以主动执行此命令。 | - | ||
读操作 |
| 获取Roaring Bitmap中指定偏移量(offset)的bit值。 | - | |
| 获取Roaring Bitmap中指定偏移量(offset)的bit值,支持查询多个值。 | V2新增 | ||
| 获取Roaring Bitmap中指定区间(偏移量)bit值为1的数量。 | V2更新,向前兼容。 | ||
| 获取第count个bit值为1或者0的偏移量,count为可选参数,默认为1(表示从前向后计数的第一个)。 | V2更新,向前兼容。 | ||
| 从Roaring Bitmap中指定偏移量(start_offset)开始向后扫描,返回若干(count)个bit值为1的偏移量,返回的游标(cursor)为Roaring Bitmap对应的offset。 说明 在迭代过程中被添加、被删除的元素的扫描结果存在不确定性,即可能被返回,也可能不会。 | V2新增 | ||
| 获取Roaring Bitmap指定区间中bit值为1的偏移量。 | V1的TR.RANGEINTARRAY命令,V2重命名为TR.RANGE。 | ||
| 获取Roaring Bitmap指定区间中所有bit值(0、1)组成的字符串。 | V2新增 | ||
| 获取Roaring Bitmap中bit值为1的最小偏移量(首个),不存在时返回-1。 | - | ||
| 获取Roaring Bitmap中bit值为1的最大偏移量,不存在时返回-1。 | - | ||
| 获取Roaring Bitmap的统计信息,包括各种容器的数量以及内存使用状况等信息。 | V2新增 | ||
| 获取两个Roaring Bitmap之间的Jaccard相似系数,Jaccard系数值越大,Roaring Bitmap的相似度越高。 说明 该命令在集群架构实例中不支持执行跨Slot的Key。 | V2.2新增 | ||
| 计算key2所对应的Roaring Bitmap是否包含key1所对应的Roaring Bitmap(即key1是否为key2的子集),若包含则返回1,否则返回0。 说明 该命令在集群架构实例中不支持执行跨Slot的Key。 | V2.2新增 | ||
| 获取Roaring Bitmap中从offset为0到指定offset区间内(包含该值),bit值为1的数量。 | V2.2新增 | ||
通用 |
| 使用原生Redis的DEL命令可以删除一条或多条TairRoaring数据。 | - |
本文关于命令语法的定义:
大写关键字
:命令关键字。斜体
:变量。[options]
:可选参数,不在括号中的参数为必选。A|B
:该组参数互斥,请进行二选一或多选一。...
:前面的内容可重复。
本文关于时间复杂度的特别约定:
C表示参数的数量(argc)或范围(range)。
M表示该种数据结构内部bit值为1的数量(例如List的node数量,Hash的field数量等)。
TR.SETBIT
类别 | 说明 |
语法 |
|
时间复杂度 | O(1) |
命令描述 | 设置Roaring Bitmap中指定偏移量(offset)的bit值(1或者0),并返回该bit位之前的值,Roaring Bitmap的偏移量(offset)从0开始。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.SETBITS
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 设置Roaring Bitmap中指定偏移量(offset)的bit值为1,支持传入多个值。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.CLEARBITS
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 设置Roaring Bitmap中指定偏移量(offset)的bit值为0,若原值为0则不操作,支持传入多个值。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.SETRANGE
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 设置Roaring Bitmap中指定区间(偏移量)的bit值为1。 例如执行 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.APPENDBITARRAY
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 将由连续的0或1组成的bit数组(bitarray)插入到Roaring Bitmap中指定偏移量(offset)之后的位置,并覆盖原有数据。 |
选项 |
|
返回值 |
|
示例 | 提前执行 命令示例:
返回示例:
此时,Roaring Bitmap foo为“101101”。 |
TR.FLIPRANGE
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 对Roaring Bitmap中指定区间(偏移量)的bit值执行位反转(1反转为0;0反转为1)。若指定key不存在,则自动创建目标key,并以空Roaring Bitmap对指定区间的bit值执行位反转。 |
选项 |
|
返回值 |
|
示例 | 提前执行 命令示例:
返回示例:
此时,Roaring Bitmap foo为“01001”。 |
TR.APPENDINTARRAY
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 设置Roaring Bitmap中指定偏移量(offset)的bit值为1,支持传入多个值。 说明 在TairRoaring V2版本中,建议使用TR.SETBITS代替该命令。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.SETINTARRAY
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 根据传入的整型数组来设置对应的Roaring Bitmap,若目标Key已存在则会重置(覆盖)原有数据。 说明 在TairRoaring V2版本中,建议使用TR.SETBITS代替该命令。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.SETBITARRAY
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 根据传入的bit(由0和1组成的字符串),创建对应的Roaring Bitmap。若目标Key已存在则会重置(覆盖)原有数据。 说明 在TairRoaring V2版本中,建议使用TR.APPENDBITARRAY代替该命令。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.BITOP
类别 | 说明 |
语法 |
|
时间复杂度 | O(C * M) |
命令描述 | 对Roaring Bitmap执行集合运算操作,计算结果存储在destkey中,支持AND、OR、XOR、NOT和DIFF集合运算类型。 说明 该命令在集群架构实例中不支持执行跨Slot的Key。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.BITOPCARD
类别 | 说明 |
语法 |
|
时间复杂度 | O(C * M) |
命令描述 | 对Roaring Bitmap执行集合运算操作,支持AND、OR、XOR、NOT和DIFF集合运算类型。 说明 该命令在集群架构实例中不支持执行跨Slot的Key。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.OPTIMIZE
类别 | 说明 |
语法 |
|
时间复杂度 | O(M) |
命令描述 | 优化Roaring Bitmap的存储空间。如果目标对象相对较大,且创建后以只读操作为主,可以主动执行此命令。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.GETBIT
类别 | 说明 |
语法 |
|
时间复杂度 | O(1) |
命令描述 | 获取Roaring Bitmap中指定偏移量(offset)的bit值。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.GETBITS
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 获取Roaring Bitmap中指定偏移量(offset)的bit值,支持查询多个值。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.BITCOUNT
类别 | 说明 |
语法 |
|
时间复杂度 | O(M) |
命令描述 | 获取Roaring Bitmap中指定区间(偏移量)bit值为1的数量。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.BITPOS
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 获取第count个bit值为1或者0的偏移量,count为可选参数,默认为1(表示从前向后计数的第一个)。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.SCAN
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 从Roaring Bitmap中指定偏移量(start_offset)开始向后扫描,返回若干(count)个bit值为1的偏移量,返回的游标(cursor)为Roaring Bitmap对应的offset。 说明 在迭代过程中被添加、被删除的元素的扫描结果存在不确定性,即可能被返回,也可能不会。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.RANGE
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 获取Roaring Bitmap指定区间中bit值为1的偏移量。 |
选项 |
|
返回值 |
|
示例 | 提前执行 命令示例:
返回示例:
|
TR.RANGEBITARRAY
类别 | 说明 |
语法 |
|
时间复杂度 | O(C) |
命令描述 | 获取Roaring Bitmap指定区间中所有bit值(0、1)组成的字符串。 |
选项 |
|
返回值 |
|
示例 | 提前执行 命令示例:
返回示例:
|
TR.MIN
类别 | 说明 |
语法 |
|
时间复杂度 | O(1) |
命令描述 | 获取Roaring Bitmap中bit值为1的最小偏移量(首个),不存在时返回-1。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.MAX
类别 | 说明 |
语法 |
|
时间复杂度 | O(1) |
命令描述 | 获取Roaring Bitmap中bit值为1的最大偏移量,不存在时返回-1。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.STAT
类别 | 说明 |
语法 |
|
时间复杂度 | O(M) |
命令描述 | 获取Roaring Bitmap的统计信息,包括各种容器的数量以及内存使用状况等信息。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.JACCARD
类别 | 说明 |
语法 |
|
时间复杂度 | O(M) |
命令描述 | 获取两个Roaring Bitmap之间的Jaccard相似系数,Jaccard系数值越大,Roaring Bitmap的相似度越高。 说明 该命令在集群架构实例中不支持执行跨Slot的Key。 |
选项 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
TR.CONTAINS
类别 | 说明 |
语法 |
|
时间复杂度 | O(M) |
命令描述 | 计算key2所对应的Roaring Bitmap是否包含key1所对应的Roaring Bitmap(即key1是否为key2的子集),若包含则返回1,否则返回0。 说明 该命令在集群架构实例中不支持执行跨Slot的Key。 |
选项 |
|
返回值 |
|
示例 | 提前执行 命令示例:
返回示例:
|
TR.RANK
类别 | 说明 |
语法 |
|
时间复杂度 | O(M) |
命令描述 | 获取Roaring Bitmap中从offset为0到指定offset区间内(包含该值),bit值为1的数量。 |
选项 |
|
返回值 |
|
示例 | 提前执行 命令示例:
返回示例:
|
异常返回值说明
错误信息 | 说明 |
| 对象类型错误:Key不是TairRoaring对象。 |
| 参数类型错误:无法按照32-bit整型进行转换。 |
| 参数非法:
|
| Roaring Bitmap对象已存在,且不支持覆盖。 说明 V2.2版之后将不会产生该报错。 |
| Roaring Bitmap对象不存在, 不支持操作。 说明 V2.2版之后将不会产生该报错。 |