記一次服務端大數據處理過程

業務背景

用戶留存分析

如圖所示爲用戶留存分析功能前端

需求分析

該柱狀圖展現的爲用戶留存百分比.redis

以按周展現爲例算法

U:活躍用戶數 x:第幾周 y:活躍佔比數據庫

公式

需求整理:數組

  1. 按日,按周,按月 三種固定日期的對比
  2. 日期選擇 隨機日期的對比

對於這種數據後臺的功能,做爲服務端開發,咱們會盡可能要求數據庫將結果統計好,由咱們服務端直接取結果作展現.數據結構

可是因爲有隨機日期的對比,假設由數據組來進行統計,意味着須要對天天都作對比統計(統計結果數據量大,耗費性能),並不現實.性能

因此最終仍是決定由服務端來作實時統計.大數據

實時統計,主要考慮前端的響應速度.優化

方案1: 以天維度存放用戶登陸信息

採用bitmap按天緯度來存放用戶登陸數據..net

實現過程:

  1. 估算總用戶量爲4億,使用bitmap存儲大概須要50M大小
  2. 給用戶排序,簡單實現:存表取id自增 (暫不考慮存表效率)
  3. 天天的登陸用戶生成一條bitmap
  4. 當計算y(x(i))時,只需提取x(1)與x(i)的bitmap作and操做,再統計結果爲1的個數,再除以x(i)的bitmap中爲1的個數

方案2: 以用戶維度存放用戶登錄時間信息

採用bitmap按用戶緯度存放登陸時間信息(哪幾天登陸)

  1. 記當天爲標準第0天

  2. 對每一個登陸用戶,將對每一個登陸用戶,將當前天數對應的位置爲1

  3. 當計算y(x(i))時

    用戶 描述 bitmap
    a 第-4,-3,-1,0天登陸 [1,1,0,1,1]
    b 第-3,-2,0天登陸 [1,1,0,1]
    B(-3,0) 第-3,0天登陸 [1,0,0,1]
    B(0) 第0天登陸 [1]
    1. 遍歷a,b與B(1,4)作and操做,統計結果==B(1,4)的個數,即1,4天都登陸用戶個數
    2. 再如法炮製獲得第4天登陸用戶個數,相除即獲得結果
優勢 缺點
方案一 查詢快,只須要作一次and操做 空間佔用太大,天天都要以最大用戶量生成一條bitmap
方案二 節省空間,空間佔用隨用戶量增加,每一個用戶的bitmap隨登錄狀況變化 查詢略慢,須要遍歷全部用戶作and操做

簡單歸納: 方案一費空間,方案二查詢慢

實際開發過程當中,因爲咱們採用redis進行存儲.

採用方案一的話內存過於浪費.而採用方案二,以個人macpro-i5配置只能負載20w/s的and操做,響應速度方面難以接受.

綜合上述方式一二都不能知足要求,只能看是否還有優化空間.

通過同事提醒,針對方式一採用一種空間壓縮算法,解決了方案一空間浪費的缺陷.

方案3: 使用RoaringBitmap以天維度存放用戶登陸信息

RoaringBitmap介紹看這

簡單歸納:

  1. 假設數據量爲不超過2^32.

  2. 將數據拆分爲高16位,低16位

  3. 對高位進行聚合(以高位作key,value爲有相同高位的全部低位數組)

  4. 根據低位的數據量(不一樣高位聚合出的低位數組長度不相同),使用不一樣的container(數據結構)存儲

    1. len<4K ArrayContainer 直接存值

    2. len>=4K BitmapContainer 使用bitmap存儲

      4K的取值緣由:value的最大總數是爲2^16=65536. 假設以bitmap方式存儲須要65536bit=8kb,而直接存值的方式,一個值16,4K個總共須要2byte*4K=8kb.因此當value總量<4k時,使用直接存值的方式更節省空間

    3. RunContainer 壓縮存儲

      RunContainer中的Run指的是行程長度壓縮算法(Run Length Encoding),對連續數據有比較好的壓縮效果.對於數列11,12,13,14,15,21,22 它會壓縮爲11,4,21,1

      1. 最優,value數組徹底連續,那麼只會存儲2個short,佔用4kb
      2. 最差,value數組徹底不連續(全奇/全偶),那麼會存儲須要存儲65536個short,128kb.

內存佔用

  1. 空間壓縮主要體如今:

    1. 高位聚合(假設數據中有100w個高位相同的值,原先須要100w*2byte,如今只要1*2byte)
    2. 低位壓縮(ArrayContainer省空間,BitmapContainer不省,RunContainer可能省)
  2. 對數據的位操做速度有影響(3種container相互and.樂觀狀況兩個BitmapContainer作and切BitCount()>4096,則數據無影響)

綜上: 使用RoaringBitmap的優缺點

  1. 節約空間(最優數據集高位都相同,最差數據集高位都不一樣)
  2. 位操做速度對原生bitmap有所降低

方案3能夠說是平衡了方案一二,是本次的最優選擇

相關文章
相關標籤/搜索