Redis?HyperLogLog數(shù)據(jù)統(tǒng)計(jì)輕量級解決方案詳解
引言
在現(xiàn)代數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用中,Redis 以其出色的性能和靈活性成為了不可或缺的工具。
特別是在統(tǒng)計(jì)大量數(shù)據(jù)時(shí),傳統(tǒng)的計(jì)數(shù)方法往往既耗時(shí)又占用大量存儲空間。
這次,阿七將介紹一種名為 HyperLogLog 的算法,它在 Redis 中的實(shí)現(xiàn)讓大規(guī)模數(shù)據(jù)統(tǒng)計(jì)變得簡單且高效。
深入理解 HyperLogLog
1、HyperLogLog 基礎(chǔ)
HyperLogLog 是一種用于估計(jì)集合中唯一元素?cái)?shù)量的算法,它通過概率統(tǒng)計(jì)方法,在極小的內(nèi)存空間內(nèi)提供近似的計(jì)數(shù)結(jié)果。這種方法特別適用于需要統(tǒng)計(jì)巨大數(shù)據(jù)集中唯一元素?cái)?shù)量的場景。
2、HyperLogLog 與傳統(tǒng)方法對比
與傳統(tǒng)的精確計(jì)數(shù)方法相比,HyperLogLog 在處理大數(shù)據(jù)集時(shí)占用極少的內(nèi)存。例如,一個(gè)包含數(shù)億唯一元素的數(shù)據(jù)集可能只需要幾百字節(jié)的內(nèi)存來估算其大小。且最大只會(huì)使用 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 ...]: 計(jì)算 HyperLogLog 中的唯一元素?cái)?shù)量。PFMERGE destkey sourcekey [sourcekey ...]: 合并多個(gè) 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");
// 獲取估算的唯一元素?cái)?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、實(shí)際應(yīng)用場景
1、計(jì)算網(wǎng)站某個(gè)功能的 UV,比如說某個(gè)網(wǎng)站的日訪客數(shù)據(jù)。比如:有多少獨(dú)立用戶播放過這首歌?這一天該頁面的獨(dú)立訪問次數(shù)有多少?有多少獨(dú)立用戶觀看過該視頻?
2、社交媒體平臺可以用它來估算獨(dú)特用戶的參與度。
案例研究
在這部分,我們可以探討一個(gè)基于真實(shí)數(shù)據(jù)的案例,展示如何在一個(gè) ToC 業(yè)務(wù)中計(jì)算某個(gè)功能的使用 UV(唯一訪問用戶數(shù)),使用 Redis HyperLogLog 來實(shí)現(xiàn)。
要使用 Redis HyperLogLog 來統(tǒng)計(jì)每天展示的 UV,并根據(jù)用戶手機(jī)的設(shè)備 UID 進(jìn)行跟蹤,你可以按照以下步驟實(shí)現(xiàn):
設(shè)置 Redis HyperLogLog: 對于每個(gè)用戶訪問,你可以使用 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)來跟蹤 UID。
業(yè)務(wù)ID + 日期為鍵: 使用日期作為鍵的一部分,這樣你可以對每天的訪問進(jìn)行獨(dú)立計(jì)數(shù)。
Java 代碼實(shí)現(xiàn): 使用 Jedis,這是一個(gè)流行的 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 大部分都知道,畢竟屬于面試八股文中很重要的一個(gè)知識點(diǎn)。它可以用來解決緩存穿透的問題,可以判斷 Redis key 是否在 DB 中,從而避免請求 DB 中不存在的數(shù)據(jù),造成 DB 壓力。
它可以使用很小的空間,存儲大規(guī)模的數(shù)據(jù)。它的特點(diǎn)是:判斷存在不一定存在,但是判斷不存在,一定不存在!
但是 Redis HyperLogLog,很多人都不知道,但是在計(jì)算大規(guī)模數(shù)據(jù)的唯一數(shù)據(jù)量級的場景下,這是一個(gè)既高效又節(jié)省空間的方法。
以上就是Redis HyperLogLog數(shù)據(jù)統(tǒng)計(jì)輕量級解決方案詳解的詳細(xì)內(nèi)容,更多關(guān)于Redis HyperLogLog數(shù)據(jù)統(tǒng)計(jì)的資料請關(guān)注腳本之家其它相關(guān)文章!
- Redis中HyperLogLog的使用小結(jié)
- Redis中?HyperLogLog數(shù)據(jù)類型使用小結(jié)
- Redis中HyperLogLog的使用詳情
- Redis如何使用HyperLogLog的實(shí)現(xiàn)
- Redis特殊數(shù)據(jù)類型HyperLogLog基數(shù)統(tǒng)計(jì)算法講解
- Redis高級數(shù)據(jù)類型Hyperloglog、Bitmap的使用
- Redis中3種特殊的數(shù)據(jù)類型(BitMap、Geo和HyperLogLog)
- Redis?HyperLogLog數(shù)據(jù)量統(tǒng)計(jì)的實(shí)現(xiàn)實(shí)例
相關(guān)文章
如何使用注解方式實(shí)現(xiàn)?Redis?分布式鎖
這篇文章主要介紹了如何使用注解方式實(shí)現(xiàn)Redis分布式鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,教大家如何優(yōu)雅的使用Redis分布式鎖,感興趣的小伙伴可以參考一下2022-07-07
redis過期回調(diào)功能實(shí)現(xiàn)示例
Redis提供了一種過期回調(diào)的機(jī)制,可以在某個(gè)鍵過期時(shí)觸發(fā)一個(gè)回調(diào)函數(shù),本文就來介紹一下redis過期回調(diào)功能實(shí)現(xiàn)示例,感興趣的可以了解一下2023-09-09

