閱讀765 返回首頁    go 阿裏雲 go 技術社區[雲棲]


阿裏雲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級實時推薦係統數據庫設計》

最後更新:2017-05-03 21:49:06

  上一篇:go oss php sdk基於swoole的簡單HTTP服務器實現
  下一篇:go 還以為自己是獨一無二的嗎?人工智能將對你say no