Redis學習筆記(5)- HyperLogLog

1、簡介

  Redis 在 2.8.9 版本添加了 HyperLogLog 結構。HyperLogLog 是用來做基數統計的算法,即實現不精確的去重計數功能,比較適合用來做大規模數據的去重統計,例如統計 UV。
  基數指一個數據集中不重複元素。基數統計即統計一個數據集中不重複元素的個數。

優缺點:

  使用HyperLogLog 來進行基數統計的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、並且是很小的。
  在 Redis 裏面,每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 2^64 個不同元素的基 數。這和計算基數時,元素越多耗費內存就越多的集合形成鮮明對比。
  但是,因爲 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個元素。同時,HyperLogLog 也是一種近似的基數統計算法。

2、HyperLogLog 命令
  1. PFADD
    語法: PFADD key element [element …]
    時間複雜度: O(1)
    功能: 將任意數量的元素添加到指定的 HyperLogLog 裏面。
    返回值: 整數回覆: 如果 HyperLogLog 的內部儲存被修改了, 那麼返回 1 , 否則返回 0 。

  作爲這個命令的副作用, HyperLogLog 內部可能會被更新, 以便反映一個不同的唯一元素估計數量(也即是集合的基數)。

  如果 HyperLogLog 估計的近似基數(approximated cardinality)在命令執行之後出現了變化, 那麼命令返回 1 , 否則返回 0 。 如果命令執行時給定的鍵不存在, 那麼程序將先創建一個空的 HyperLogLog 結構, 然後再執行命令。

  調用 PFADD key element [element …] 命令時可以只給定鍵名而不給定元素:
  1. 如果給定鍵已經是一個 HyperLogLog , 那麼這種調用不會產生任何效果;
  2. 但如果給定的鍵不存在, 那麼命令會創建一個空的 HyperLogLog , 並向客戶端返回 1 。
在這裏插入圖片描述
2. PFCOUNT
語法: PFCOUNT key [key …]
時間複雜度: 當命令作用於單個 HyperLogLog 時, 複雜度爲 O(1) , 並且具有非常低的平均常數時間。 當命令作用於 N 個 HyperLogLog 時, 複雜度爲 O(N) , 常數時間也比處理單個 HyperLogLog 時要大得多。
功能: 當 PFCOUNT key [key …] 命令作用於單個鍵時, 返回儲存在給定鍵的 HyperLogLog 的近似基數, 如果鍵不存在, 那麼返回 0 。當 PFCOUNT key [key …] 命令作用於多個鍵時, 返回所有給定 HyperLogLog 的並集的近似基數, 這個近似基數是通過將所有給定 HyperLogLog 合併至一個臨時 HyperLogLog 來計算得出的。
返回值: 整數回覆: 給定 HyperLogLog 包含的唯一元素的近似數量。

  通過 HyperLogLog 數據結構, 用戶可以使用少量固定大小的內存, 來儲存集合中的唯一元素 (每個 HyperLogLog 只需使用 12k 字節內存,以及幾個字節的內存來儲存鍵本身)。
  命令返回的可見集合(observed set)基數並不是精確值, 而是一個帶有 0.81% 標準錯誤(standard error)的近似值。
  舉個例子, 爲了記錄一天會執行多少次各不相同的搜索查詢, 一個程序可以在每次執行搜索查詢時調用一次 PFADD key element [element …] , 並通過調用 PFCOUNT key [key …] 命令來獲取這個記錄的近似結果。
在這裏插入圖片描述
3. PFMERGE
語法: PFMERGE destkey sourcekey [sourcekey …]
時間複雜度: O(N) , 其中 N 爲被合併的 HyperLogLog 數量, 不過這個命令的常數複雜度比較高。
功能: 將多個 HyperLogLog 合併(merge)爲一個 HyperLogLog , 合併後的 HyperLogLog 的基數接近於所有輸入 HyperLogLog 的可見集合(observed set)的並集。合併得出的 HyperLogLog 會被儲存在 destkey 鍵裏面, 如果該鍵並不存在, 那麼命令在執行之前, 會先爲該鍵創建一個空的 HyperLogLog 。
返回值: 字符串回覆:返回 OK 。
在這裏插入圖片描述

3、HyperLogLog應用

  在某些需要儘可能地節約內存並且只需要知道在線用戶數量的情況下, 我們可以使用 HyperLogLog 來對在線用戶進行統計: HyperLogLog 是一個概率算法, 它可以對元素的基數進行估算, 並且每個 HyperLogLog 只需要耗費 12 KB 內存, 對於用戶數量非常多但是內存卻非常緊張的系統。

  使用HyperLogLog統計在線人數時, 我們使用 PFADD 命令去記錄在線的用戶:

PFADD "online_users" <user_id>

  使用 PFCOUNT 命令獲取在線人數:

PFCOUNT "online_users"

  因爲 HyperLogLog 也提供了計算交集的 PFMERGE 命令, 所以我們也可以用這個命令計算出多個給定時間段或日期之內, 上線的總人數:

# 統計 7 天之內總共有多少人上線了
PFMERGE "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ... "day_7_online_users"
PFCOUNT "7_days_both_online_users"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章