阿里云RDS for PostgreSQL varbitx插件与实时画像应用场景介绍

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

标签

PostgreSQL , varbitx , 阿里云 , 实时画像


背景

PostgreSQL 内置的varbit, bit类型的操作函数比较简单,阿里云RDS for PostgreSQL对其进行了扩展。

支持更多的bit操作,可以覆盖更广的应用场景,例如实时用户画像推荐系统、门禁广告系统、购票系统等。

阿里云 varbitx 插件介绍

增加的函数接口如下

1. bit_count

bit_count (  
  varbit,   
  int,   -- (0|1)  
  int,   -- (n)  
  int    -- (N)  
) returns int  
  
  从第n位开始(起始位=0),统计N个BIT位中有多少个0|1,如果N超出长度,则只计算已经存在的。    
  例如 bit_count('1111000011110000', 1, 5, 4) 返回 1   -- (0001)  

2. bit_count

bit_count (  
  varbit,   
  int  
) returns int   
  
  统计整个bit string中0|1的个数。    
  例如 bit_count('1111000011110000', 1) 返回 8  

3. bit_count_array

bit_count_array (  
  varbit,   
  int,   
  int[]   -- 位置数组, (起始位=0)  
) returns int    
  
  统计指定位置bit string中0|1的个数。    
  例如 bit_count_array('1111000011110000', 1, array[1,2,7,8]) 返回 3   -- (1,1,0,1)  

4. bit_fill

bit_fill (  
  int,   -- (0|1)  
  int    -- BIT string 长度  
) returns varbit   
  
  填充指定长度的0 或 1  
  例如 bit_fill(0,10) 返回 '0000000000'  

5. bit_posite

bit_posite (  
  varbit,   
  int,      -- (0|1)  
  boolean   
) returns int[]    
  
  返回 0|1 的位置,(起始位=0), true时正向返回,false时反向返回      
  例如 bit_posite ('11110010011', 1, true) 返回 [0,1,2,3,6,9,10]    
       bit_posite ('11110010011', 1, false) 返回 [10,9,6,3,2,1,0]  

6. bit_posite

bit_posite (  
  varbit,  
  int,    -- (0|1)  
  int,    -- N  
  boolean   
) returns int[]    
  
  返回 0|1 的位置,(起始位=0),true时正向返回,false时反向返回,返回N个为止    
  例如 bit_posite ('11110010011', 1, 3, true) 返回 [0,1,2]    
       bit_posite ('11110010011', 1, 3, false) 返回 [10,9,6]    

7. get_bit

get_bit (  
  varbit,   
  int,    -- n  
  int     -- N  
) returns varbit  
  
  从指定位置n开始获取N个BIT位,(起始位=0),返回varbit  
  例如 get_bit('111110000011', 3, 5)   返回11000  

8. get_bit_array

get_bit_array (  
  varbit,   
  int,    -- n  
  int,    -- N  
  int     -- (0|1)  
) returns int[]  
  
  从指定位置n开始获取N个BIT位,返回0|1的位置下标,(起始位=0)   
  例如 get_bit_array('111110000011', 3, 5, 1)   返回11000的下标 array[3,4]  

9. get_bit_array

get_bit_array (  
varbit,   
int,     -- (0|1)  
int[]    -- 位置数组  
) returns int[]  
  
  查询指定位置的BIT,返回其中是0|1的BIT的位置(起始位=0) ,返回下标,超出不统计   
  例如 get_bit_array('111110000011', 1, array[1,5,6,7,10,11])   返回array[1,10,11]  

10. set_bit_array

set_bit_array (  
  varbit,   
  int,   -- 目标BIT (0|1)  
  int,   -- 填充BIT (0|1)  
  int[]  -- 目标位置  
) returns varbit   
  
  将指定位置的BIT设置为0|1,(起始位=0),超出原始长度的部分填充0|1    
  例如 set_bit_array('111100001111', 0, 1, array[1,15]) 返回 1011000011111110  

11. set_bit_array

set_bit_array (  
  varbit,   
  int,   -- 目标BIT (0|1)   
  int,   -- 填充BIT (0|1)   
  int[], -- 目标位置   
  int    -- 成功设置若干位  
) returns varbit   
  
  将指定位置的BIT设置为0|1,(起始位=0),超出原始长度的部分填充0|1 , 首先填充,设置N位即返回    
  例如 set_bit_array('111110001111', 1, 0, array[4,5,6,15], 2) 返回 1111111011110000   ( 设置为1, 超出补0, 成功设置满2位即返回 (成功设置指将原来的0设置为1或反之,如果原来已经是目标值则不算数) )  

12. set_bit_array_record

set_bit_array_record (  
  varbit,   
  int,   -- 目标BIT (0|1)  
  int,   -- 填充BIT (0|1)  
  int[]  -- 目标位置  
) returns (varbit,int[])   
  
  将指定位置的BIT设置为0|1,(起始位=0),超出原始长度的部分填充0|1   
  返回设置后的varbit  
  同时返回(原来不是0|1)此次被设置为0|1的位置数组   
  例如 set_bit_array_record('111100001111', 0, 1, array[1,15]) 返回 1011000011111110   (设置为0, 超出补1)  
  同时返回array[1,15]  (超出原始长度的不返回)  

13. set_bit_array_record

set_bit_array_record (  
  varbit,   
  int,   -- 目标BIT (0|1)   
  int,   -- 填充BIT (0|1)   
  int[], -- 目标位置   
  int    -- 成功设置若干位  
) returns (varbit,int[])  
  
  将指定位置的BIT设置为0|1,(起始位=0),超出原始长度的部分填充0|1 , 设置N位即返回   
  返回设置后的varbit  
  同时返回(原来不是0|1)此次被设置为0|1的位置数组   
  例如 set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2) 返回 111111001111   (设置为1, 超出补0, 设置满2位即返回 (成功设置指将原来的0设置为1或反之,如果原来已经是目标值则不算数) )  
  同时返回array[4,5]  (超出原始长度的不返回)  

使用 varbitx

例子

test=> create extension varbitx;  
CREATE EXTENSION  
  
test=> select bit_count('1111000011110000', 1, 5, 4);  
 bit_count   
-----------  
         1  
(1 row)  
  
test=> select bit_count('1111000011110000', 1);;  
 bit_count   
-----------  
         8  
(1 row)  
  
test=> select bit_count_array('1111000011110000', 1, array[1,2,7,8]);  
 bit_count_array   
-----------------  
               3  
(1 row)  
  
test=> select bit_fill(0,10);  
  bit_fill    
------------  
 0000000000  
(1 row)  
  
test=> select bit_posite ('11110010011', 1, true);  
    bit_posite      
------------------  
 {0,1,2,3,6,9,10}  
(1 row)  
  
test=> select bit_posite ('11110010011', 1, false);  
    bit_posite      
------------------  
 {10,9,6,3,2,1,0}  
(1 row)  
  
test=> select bit_posite ('11110010011', 1, 3, true);  
 bit_posite   
------------  
 {0,1,2}  
(1 row)  
  
test=> select bit_posite ('11110010011', 1, 3, false);  
 bit_posite   
------------  
 {10,9,6}  
(1 row)  
  
test=> select get_bit('111110000011', 3, 5);  
 get_bit   
---------  
 11000  
(1 row)  
  
test=> select get_bit_array('111110000011', 3, 5, 1);  
 get_bit_array   
---------------  
 {3,4}  
(1 row)  
  
test=> select get_bit_array('111110000011', 1, array[1,5,6,7,10,11]);  
 get_bit_array   
---------------  
 {1,10,11}  
(1 row)  
  
test=> select set_bit_array('111100001111', 0, 1, array[1,15]);  
  set_bit_array     
------------------  
 1011000011111110  
(1 row)  
  
test=> select set_bit_array('111110001111', 1, 0, array[4,5,6,15], 2);  
  set_bit_array     
------------------  
 1111111011110000  
(1 row)  
  
test=> select set_bit_array_record('111100001111', 0, 1, array[1,15]);  
    set_bit_array_record       
-----------------------------  
 (1011000011111110,"{1,15}")  
(1 row)  
  
test=> select set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2);  
  set_bit_array_record    
------------------------  
 (111111001111,"{4,5}")  
(1 row)  

案例

《基于 varbitx 打造 实时用户画像推荐系统》

《基于 varbitx 打造 门禁广告销售系统需求剖析》

《varbitx 与 12306 抢火车票的思考》

《万亿user_tags级实时推荐系统数据库设计》

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
关系型数据库 分布式数据库 数据库
成都晨云信息技术完成阿里云PolarDB数据库产品生态集成认证
近日,成都晨云信息技术有限责任公司(以下简称晨云信息)与阿里云PolarDB PostgreSQL版数据库产品展开产品集成认证。测试结果表明,晨云信息旗下晨云-站群管理系统(V1.0)与阿里云以下产品:开源云原生数据库PolarDB PostgreSQL版(V11),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
1月前
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
372 3
|
1月前
|
存储 关系型数据库 数据库
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
迎峰而上:汇联易依托阿里云RDS通用云盘,加速业务智能化升级
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
|
1月前
|
弹性计算 缓存 Kubernetes
什么是阿里云弹性容器实例?弹性容器实例优势及应用场景介绍
弹性容器实例是阿里云的云服务器产品,使用弹性容器实例之后,用户无需管理底层 ECS 服务器,只需要提供打包好的镜像,即可运行容器,与阿里云容器服务无缝对接并仅为容器实际运行消耗的资源付费。本文介绍了阿里云弹性容器实例的、功能特性、产品优势及应用场景。
什么是阿里云弹性容器实例?弹性容器实例优势及应用场景介绍
|
1月前
|
存储 弹性计算 Serverless
什么是阿里云FPGA云服务器?FPGA云服务器产品优势及应用场景介绍
FPGA云服务器是阿里云提供的实例规格,融合现场可编程门阵列的低延迟硬件加速与弹性资源。FaaS平台简化了FPGA开发,提供统一硬件、开发环境和丰富的IP生态。特性包括硬件虚拟化、联合仿真和动态互联配置。产品计费与ECS一致,支持多种计费模式。优势在于分钟级交付、高性能加速、经济性价比和设计复用。应用广泛,如视频转码、人工智能、基因测序等。FPGA云服务器通过FPGA镜像、OSS服务等工具进行管理。
什么是阿里云FPGA云服务器?FPGA云服务器产品优势及应用场景介绍
|
1月前
|
弹性计算 关系型数据库 MySQL
阿里云MySQL云数据库优惠价格、购买和使用教程分享!
阿里云数据库使用流程包括购买和管理。首先,选购支持MySQL、SQL Server、PostgreSQL等的RDS实例,如选择2核2GB的MySQL,设定地域和可用区。购买后,等待实例创建。接着,创建数据库和账号,设置DB名称、字符集及账号权限。最后,通过DMS登录数据库,填写账号和密码。若ECS在同一地域和VPC内,可内网连接,记得将ECS IP加入白名单。
443 2
|
1月前
|
SQL 关系型数据库 MySQL
阿里云mysql数据库价格购买和使用教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,通过选择配置、地域和可用区完成购买。创建数据库和账号,分配权限。使用DMS登录数据库,进行管理操作。确保ECS与RDS在同一地域的VPC内,配置白名单实现内网连接。详细步骤见官方文档。
632 1
|
1月前
|
关系型数据库 MySQL 数据库
使用阿里云的数据传输服务DTS(Data Transmission Service)进行MySQL 5.6到MySQL 8.0的迁移
【2月更文挑战第29天】使用阿里云的数据传输服务DTS(Data Transmission Service)进行MySQL 5.6到MySQL 8.0的迁移
225 2
|
1月前
|
SQL 关系型数据库 MySQL
购买阿里云RDS实例
购买阿里云RDS实例
167 2
|
1月前
|
人工智能 IDE API
灵动指尖 :阿里云智能编码插件 更好的为IDE内置社区服务
灵动指尖 :阿里云智能编码插件 更好的为IDE内置社区服务

相关产品

  • 云数据库 RDS MySQL 版
  • 云原生数据库 PolarDB