您好,登錄后才能下訂單哦!
這篇文章主要介紹了Redis的HyperLogLog算法怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Redis的HyperLogLog算法怎么用文章都會有所收獲,下面我們一起來看看吧。
今天是周五,你正開心的摸魚,產品經理通過郵件給你發了一個需求文檔。需求大概是:公司要統計網站每天的訪客 IP,而且這個統計是一個長期的行為,短則數月、長則幾年。
你看完需求就覺得這 so easy 啊,使用 Redis 的集合類型可以輕松實現這個功能:每天生成一個集合類型的鍵,使用 SADD 存儲每天的訪客 IP,使用 SCARD 命令就可以輕松得到每天訪客 IP 的數量。
你很快就敲完了代碼并通過測試,這個功能就上線了。上線后運行一段時間發現 Redis 所在服務器開始告警,原因是某些鍵的內存占用過大,你看了一下發現這些鍵都是存儲訪客 IP 的集合鍵。你這才拍了一下腦袋,知道自己給自己挖了一個大坑。
假設存儲一個 IPv4 格式的 IP 地址最多需要 15 個字節,網站每天最多有 100 萬個訪客訪問網站。這些集合鍵一個月就將使用 0.45 GB 的內存,一年將占用 5.4 GB 的內存,這還只是估算了 IPv4 格式的情況下,若是 IPv6 格式將占用更多的內存。SADD 和 SCARD 的時間復雜度雖然都是 O(1),但是它們對內存的消耗是無法接受的。
你在 Redis 的官方網站翻了翻,發現 Redis 還提供了一種數據類型 HyperLogLog,它既可以實現產品的需求還占用更少的內存。
HyperLogLog 是一個專門為了計算集合的基數而創建的概率算法,它可以計算出一個給定集合的近似基數。
近似基數并非集合的實際基數,它可能會比實際的基數小一點或者大一點,但是估算基數和實際基數之間的誤差會處于一個合理的范圍之內,對于那些不要求十分精確的統計就可以使用 HyperLogLog 算法。
HyperLogLog 的優點在于它計算近似基數所需的內存并不會因為集合的大小而改變,無論集合包含的元素有多少個,HyperLogLog 進行計算所需的內存總是固定的,并且是非常少的。
Redis 的每個 HyperLogLog 類型只需要使用 12KB 內存空間,就可以對接近:264 個元素進行計數,而算法的標準誤差僅為 0.81%。
如果使用 HyperLogLog 類型實現上述功能,每天有 100 萬個訪客的情況下,1 個月也僅僅占用 360KB 的內存。
通過 PFADD 命令可以對給定的一個或多個集合元素進行計數。
PFADD key element [element...]
根據給定的元素是否已經進行過計數,PFADD 命令可能返回 0,也可能返回 1:
如果給定的所有元素都已經進行過計數,那么 PFADD 命令將返回 0,表示 HyperLogLog 計算出的近似基數沒有發生變化。
如果給定的元素中出現了至少一個之前沒有進行過計數的元素,導致 HyperLogLog 計算出的近似基數發生了變化,那么 PFADD 命令將返回 1。
例如:
redis> PFADD letters a b c -- 第一次添加 (integer) 1 redis> PFADD letters a -- 第二次添加 (integer) 0
如果在調用該命令時僅指定 key 而不指定元素也是可以的,如果 key 存在,則不會有任何操作,如果不存在,則會創建一個數據結構(返回 1)。
通過 PFCOUNT 命令可以獲取 HyperLogLog 為集合計算出的近似基數。若給定的 key 不存在將返回 0。
PFCOUNT key [key...]
例如:
redis> PFCOUNT letters (integer) 3
當向 PFCOUNT 傳入多個 HyperLogLog 時,PFCOUNT 命令將先對所有的 HyperLogLog 求并集,然后返回近似基數。
redis> PFADD letters1 a b c (integer) 1 redis> PFADD letters2 c d e (integer) 1 redis> PFCOUNT letters1 letters2 (integer) 5
PFMERGE 命令可以對多個 HyperLogLog 執行并集計算,然后把計算得出的并集 HyperLogLog 保存到指定的鍵中。
PFMERGE destKey sourceKey [sourceKey...]
如果指定的鍵已經存在,PFMERGE 命令將覆蓋已有的鍵。
redis> PFADD letters1 a b c (integer) 1 redis> PFADD letters2 c d e (integer) 1 redis> PFMERGE res letters1 letters2 OK redis> PFCOUNT res (integer) 5
可以看到 PFMERGE 和 PFCOUNT 命令十分相似,實際上 PFCOUNT 命令在計算多個 HyperLogLog 的近似基數時會執行以下操作:
在內部調用 PFMERGE 命令,計算所有給定 HyperLogLog 的并集,并將這個并集存儲到一個臨時的 HyperLogLog 中。
對臨時 HyperLogLog 執行 PFCOUNT 命令,得到它的近似基數。
刪除臨時 HyperLogLog。
返回得到的近似基數。
當程序需要對多個 HyperLogLog 調用 PFCOUNT 命令,并且這個調用可能會重復執行多次時,可以考慮把這一調用替換成相應的 PFMERGE 命令調用:通過把并集的計算結果存儲到指定的 HyperLogLog 中而不是每次都重新計算并集,程序可以最大程度地減少不必要的并集計算。
HyperLogLog 的特性十分適合:計數(月度、年度統計)、去重(垃圾短信檢測)等場景。
關于“Redis的HyperLogLog算法怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Redis的HyperLogLog算法怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。