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

标签

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级实时推荐系统数据库设计》

时间: 2024-09-18 09:21:41

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

海量数据,海明距离高效检索(smlar) - 阿里云RDS PosgreSQL最佳实践

标签 PostgreSQL , 海明距离 , smlar , GiST索引 背景 http://www.cnblogs.com/lushilin/p/6549665.html SimHash的应用 通过上面的步骤,我们可以利用SimHash算法为每一个网页生成一个向量指纹,那么问题来了,如何判断2篇文本的相似性? 这里面主要应用到是海明距离. (1)什么是海明距离 两个码字的对应比特取值不同的比特数称为这两个码字的海明距离.在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离

阿里云RDS PG实践 - 流式标签 - 万亿级,实时任意标签圈人

标签 PostgreSQL , 阅后即焚 , 流计算 , 标签 背景 varbitx是阿里云RDS PG提供的一个BIT操作插件,使用这个插件已经成功的帮助用户提供了万亿级的毫秒级实时圈人功能. <阿里云RDS for PostgreSQL varbitx插件与实时画像应用场景介绍> <基于 阿里云 RDS PostgreSQL 打造实时用户画像推荐系统(varbitx)> 结合阅后即焚的流式批量处理,schemaless UDF,可以实现高效的增.删标签,以及毫秒级别的按标签圈人

音视图(泛内容)网站透视分析 DB设计 - 阿里云(RDS、HybridDB) for PostgreSQL最佳实践

标签 PostgreSQL , 用户透视 , 设备透视 , 圈人 , 标签 , 视频网站 , 优酷 , 土豆 , 喜马拉雅 背景 日常生活中,人们使用最多的除了社交类网站.购物网站,估计就是音频.视频.图文信息类内容网站了. 视频网站,已经渗透到各种终端,除了喜闻乐见的手机,还包括移动终端.电脑.盒子.电视.投影仪等.有设备属性.会员属性.渠道属性等. 内容运营是非常重要的环节,而透视则是运营的重要武器. 业务需求 1.生成设备.会员画像 ID.各个维度的标签.其中包括一些多值列标签(例如最近7

(新零售)商户网格化运营 - 阿里云RDS PostgreSQL最佳实践

标签 PostgreSQL , PostGIS , 地理位置 , KNN , 近邻检索 , 网格检索 , polygon中心点 , 半径搜索 背景 伟大的马老师说: "纯电商时代很快会结束,未来的十年.二十年,没有电子商务这一说,只有新零售这一说,也就是说线上线下和物流必须结合在一起,才能诞生真正的新零售" 线上是指云平台,线下是指销售门店或生产商,新物流消灭库存,减少囤货量. 电子商务平台消失是指,现有的电商平台分散,每个人都有自己的电商平台,不再入驻天猫.京东.亚马逊大型电子商务平

海量实时计算+OLTP+OLAP DB设计 - 阿里云(RDS、HybridDB) for PostgreSQL最佳实践 - 泛电网系统应用

标签 PostgreSQL , 国家电网 , 电表 , 余额 , 流式计算 , 状态监测 , 上下文相关 背景 电网系统是一个关系民生,又非常典型的传统系统,虽然传统,量可不小.在互联网化(物联网化)的今天,有很多值得借鉴和思考的点供给其他相关系统参考. 每个省份大概有亿级户电表,最大的地市可能有千万户级别. 以往我们电费是怎么交的呢?我们小区是两个月交一次,也就是说先消费,再付款的方式.这么说起来电网真的是很仁义啊,现在哪有这么多先消费再付款的呀.移动话费.家庭宽带.天然气等等,都是充值后使用

云端流计算、在线业务、实时分析 闭环设计 - 阿里云RDS、HybridDB for PostgreSQL最佳实践

背景 水的流动汇成江河大海,孕育生命,形成大自然生态.数据流动,推进社会进步,拓展业务边界. <从人类河流文明 洞察 数据流动的重要性> 以某淘系业务案例展开,看看用户如何利用阿里云RDS PostgreSQL,HybridDB for PostgreSQL,海量对象存储OSS,打造一个从流计算到在线业务,再到数据分析和挖掘的业务,发挥数据的价值,拓展业务的边界. 业务简介 一个电商业务通常会涉及 商家.门店.物流.用户.支付渠道.贷款渠道.商品.平台.小二.广告商.厂家.分销商.店主.店员.

贷款、天使投资(风控助手)业务数据库设计 - 阿里云RDS PostgreSQL, HybridDB for PostgreSQL最佳实践

标签 PostgreSQL , HybridDB for PostgreSQL , 小微贷款 , 金融风控 , 企业图谱 , 图式搜索 , 舆情分析 , 自动贷款 , 贷款审查 , 审查神器 背景 贷款是银行的主营业务之一,但是并不是只有银行能提供贷款,实际上资金雄厚的公司都有能力提供贷款(比如保险行业.资源垄断型企业等). 除了放贷,我们常说的天使投资.A轮B轮啥的,也是类似的场景,凭什么投你,背后如何决策也需要决策系统的支撑. 与贷款相反的是吸金类业务,比如我们现在发现越来越多的理财产品.股

菜鸟末端轨迹(解密支撑每天251亿个包裹的数据库) - 阿里云RDS PostgreSQL最佳实践

标签 PostgreSQL , PostGIS , 多边形 , 面 , 点 , 面点判断 , 菜鸟 背景 菜鸟末端轨迹项目中涉及的一个关键需求,面面判断. 在数据库中存储了一些多边形记录,约几百万到千万条记录,例如一个小区,在地图上是一个多边形. 不同的快递公司,会有各自不同的多边形划分方法(每个网点负责的片区(多边形),每个快递员负责的片区(多边形)). 用户在寄件时,根据用户的位置,查找对应快递公司负责这个片区的网点.或者负责该片区的快递员. 一.需求 1.在数据库中存储了一些静态的面信息,

如何搭建阿里云RDS PostgreSQL数据库的物理备库

如何搭建阿里云RDS PostgreSQL数据库的物理备库 用户在阿里云购买了RDS PostgreSQL,如何在自己的机房或者ECS上建立备库?关于如何构建逻辑备库,在我以前的文章有详细的讲解,所谓逻辑备库,是可以跨版本,甚至仅仅同步一部分相同步的表的备库.https://yq.aliyun.com/articles/7240 如果用户需要构建一个和RDS PostgreSQL一模一样的备库,则可以通过流复制或者归档来完成. 步骤如下.1. 准备备库环境 安装64位Linux 安装与RDS P