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