Redis深度歷險筆記03 Bitmap位圖和HyperLogLog

Bitmap 位圖

  • 位圖不是特殊的數據結構,它其實就是普通的字符串,也就是 byte 數組,用 getbit 和 setbit 來操作,能夠統計精確的值。
  • 可以用於布爾型數據的存取,比如用戶一年的簽到記錄,簽到了是1,沒簽到是0,記錄365天,通過 bitcount 指令來統計用戶一共簽到了多少天,每個簽到記錄只佔用一位,365位大約是46個字節大小,用戶上億時,大大節約了內存空間。

HyperLogLog

  • 採用基數算法實現,它設有 16384 個桶進行獨立計數,也就是 2 的 14 次方,每個桶佔 6 位,2 的 14 次方乘以 6 再除以 8,就等於 12k 字節了。
  • 佔用空間小,無論統計多少個數據,最多佔用12K的內存。(redis 設有 16384個桶,每個桶裏的數據最多需要6位進行存儲,16384 x 6 / 8 約等於 12k 字節)
  • 它統計值時存在誤差,標準誤差爲0.81%

HyperLogLog 使用場景

  • 根據用戶的IP來統計訪問量,需要去重,同一個用戶一天之內的多次訪問請求只能計數一次,所以每個網頁請求都需要帶上用戶的ID,無論是登錄用戶還是未登錄的遊客,都需要一個唯一ID來標識。
  • 最開始容易想到的是爲每一個頁面設置一個獨立的 set 集合來存儲當天訪問該頁面的所有用戶ID,但如果頁面訪問量非常大,比如幾千萬的 UV,這樣 set 集合就會非常大,浪費了空間,而且對於這個 UV 值,一般情況下並不需要多麼的精確,比如 100 萬和 101 萬,對於這個場景,並沒什麼大的區別。所以想到了採用 redis 的 HyperLogLog 數據結構來實現。
  • HyperLogLog 提供不精確的去重計數方案,標準誤差爲 0.81%,這個精確度已經可以滿足 UV 的統計需求了,而且佔用的內存不超過12k。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章