Redis?HyperLogLog數(shù)據(jù)統(tǒng)計輕量級解決方案詳解
引言
在現(xiàn)代數(shù)據(jù)驅(qū)動的應(yīng)用中,Redis 以其出色的性能和靈活性成為了不可或缺的工具。
特別是在統(tǒng)計大量數(shù)據(jù)時,傳統(tǒng)的計數(shù)方法往往既耗時又占用大量存儲空間。
這次,阿七將介紹一種名為 HyperLogLog 的算法,它在 Redis 中的實現(xiàn)讓大規(guī)模數(shù)據(jù)統(tǒng)計變得簡單且高效。
深入理解 HyperLogLog
1、HyperLogLog 基礎(chǔ)
HyperLogLog 是一種用于估計集合中唯一元素數(shù)量的算法,它通過概率統(tǒng)計方法,在極小的內(nèi)存空間內(nèi)提供近似的計數(shù)結(jié)果。這種方法特別適用于需要統(tǒng)計巨大數(shù)據(jù)集中唯一元素數(shù)量的場景。
2、HyperLogLog 與傳統(tǒng)方法對比
與傳統(tǒng)的精確計數(shù)方法相比,HyperLogLog 在處理大數(shù)據(jù)集時占用極少的內(nèi)存。例如,一個包含數(shù)億唯一元素的數(shù)據(jù)集可能只需要幾百字節(jié)的內(nèi)存來估算其大小。且最大只會使用 12 KB 的內(nèi)存。
Redis 中的 HyperLogLog
1、Redis 與 HyperLogLog
在 Redis 中,HyperLogLog 提供了一些基本命令來處理這種類型的數(shù)據(jù)結(jié)構(gòu)。以下是一些基本的 Redis 命令:
PFADD key element [element ...]
: 向 HyperLogLog 中添加元素。PFCOUNT key [key ...]
: 計算 HyperLogLog 中的唯一元素數(shù)量。PFMERGE destkey sourcekey [sourcekey ...]
: 合并多個 HyperLogLog。
而且,HyperLogLog 提供了驚人的精度與性能平衡。通常,它的標(biāo)準(zhǔn)誤差為 0.81%,這對于大多數(shù)應(yīng)用來說已經(jīng)足夠準(zhǔn)確。
2、代碼示例:
// Redis HyperLogLog 操作示例 Jedis jedis = new Jedis("localhost"); String key = "page_views"; // 添加元素 jedis.pfadd(key, "user1"); jedis.pfadd(key, "user2"); // 獲取估算的唯一元素數(shù)量 long count = jedis.pfcount(key); System.out.println("Estimated unique elements: " + count); // 合并 HyperLogLog String otherKey = "more_page_views"; jedis.pfadd(otherKey, "user3"); jedis.pfmerge(key, otherKey); // 再次獲取估算數(shù)量 long mergedCount = jedis.pfcount(key); System.out.println("Estimated unique elements after merge: " + mergedCount);
3、實際應(yīng)用場景
1、計算網(wǎng)站某個功能的 UV,比如說某個網(wǎng)站的日訪客數(shù)據(jù)。比如:有多少獨立用戶播放過這首歌?這一天該頁面的獨立訪問次數(shù)有多少?有多少獨立用戶觀看過該視頻?
2、社交媒體平臺可以用它來估算獨特用戶的參與度。
案例研究
在這部分,我們可以探討一個基于真實數(shù)據(jù)的案例,展示如何在一個 ToC 業(yè)務(wù)中計算某個功能的使用 UV(唯一訪問用戶數(shù)),使用 Redis HyperLogLog 來實現(xiàn)。
要使用 Redis HyperLogLog 來統(tǒng)計每天展示的 UV,并根據(jù)用戶手機的設(shè)備 UID 進(jìn)行跟蹤,你可以按照以下步驟實現(xiàn):
設(shè)置 Redis HyperLogLog: 對于每個用戶訪問,你可以使用 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)來跟蹤 UID。
業(yè)務(wù)ID + 日期為鍵: 使用日期作為鍵的一部分,這樣你可以對每天的訪問進(jìn)行獨立計數(shù)。
Java 代碼實現(xiàn): 使用 Jedis,這是一個流行的 Java Redis 客戶端,來與 Redis 進(jìn)行通信。
import redis.clients.jedis.Jedis; public class UVCounter { private Jedis jedis; private String static final String BUSINESS_ID = "business_id"; public UVCounter(String host, int port) { this.jedis = new Jedis(host, port); } public void addVisit(String date, String deviceUID) { String key = "uv:" + date; jedis.pfadd(key, deviceUID); } public long getUVCount(String date) { String key = BUSINESS_ID + ":" + "uv:" + date; return jedis.pfcount(key); } public static void main(String[] args) { UVCounter uvCounter = new UVCounter("localhost", 6379); // 假設(shè)這是今天的日期 String today = "2023-12-16"; // 模擬一些用戶訪問 uvCounter.addVisit(today, "device1"); uvCounter.addVisit(today, "device2"); uvCounter.addVisit(today, "device3"); uvCounter.addVisit(today, "device1"); // 重復(fù)的設(shè)備 UID // 獲取今天的 UV 數(shù) long uvCount = uvCounter.getUVCount(today); System.out.println("Unique Visitors Today: " + uvCount); } }
總結(jié)
Redis Bloom filter 大部分都知道,畢竟屬于面試八股文中很重要的一個知識點。它可以用來解決緩存穿透的問題,可以判斷 Redis key 是否在 DB 中,從而避免請求 DB 中不存在的數(shù)據(jù),造成 DB 壓力。
它可以使用很小的空間,存儲大規(guī)模的數(shù)據(jù)。它的特點是:判斷存在不一定存在,但是判斷不存在,一定不存在!
但是 Redis HyperLogLog,很多人都不知道,但是在計算大規(guī)模數(shù)據(jù)的唯一數(shù)據(jù)量級的場景下,這是一個既高效又節(jié)省空間的方法。
以上就是Redis HyperLogLog數(shù)據(jù)統(tǒng)計輕量級解決方案詳解的詳細(xì)內(nèi)容,更多關(guān)于Redis HyperLogLog數(shù)據(jù)統(tǒng)計的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳談redis跟數(shù)據(jù)庫的數(shù)據(jù)同步問題
文章討論了在Redis和數(shù)據(jù)庫數(shù)據(jù)一致性問題上的解決方案,主要比較了先更新Redis緩存再更新數(shù)據(jù)庫和先更新數(shù)據(jù)庫再更新Redis緩存兩種方案,文章指出,刪除Redis緩存后再更新數(shù)據(jù)庫的方案更優(yōu),因為它可以避免數(shù)據(jù)不一致的問題,但可能產(chǎn)生高并發(fā)問題2025-01-01Redis數(shù)據(jù)結(jié)構(gòu)之鏈表詳解
大家好,本篇文章主要講的是Redis數(shù)據(jù)結(jié)構(gòu)之鏈表詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12