Redis?HyperLogLog數(shù)據(jù)統(tǒng)計(jì)輕量級(jí)解決方案詳解
引言
在現(xiàn)代數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用中,Redis 以其出色的性能和靈活性成為了不可或缺的工具。
特別是在統(tǒng)計(jì)大量數(shù)據(jù)時(shí),傳統(tǒng)的計(jì)數(shù)方法往往既耗時(shí)又占用大量存儲(chǔ)空間。
這次,阿七將介紹一種名為 HyperLogLog 的算法,它在 Redis 中的實(shí)現(xiàn)讓大規(guī)模數(shù)據(jù)統(tǒng)計(jì)變得簡(jiǎn)單且高效。
深入理解 HyperLogLog
1、HyperLogLog 基礎(chǔ)
HyperLogLog 是一種用于估計(jì)集合中唯一元素?cái)?shù)量的算法,它通過(guò)概率統(tǒng)計(jì)方法,在極小的內(nèi)存空間內(nèi)提供近似的計(jì)數(shù)結(jié)果。這種方法特別適用于需要統(tǒng)計(jì)巨大數(shù)據(jù)集中唯一元素?cái)?shù)量的場(chǎng)景。
2、HyperLogLog 與傳統(tǒng)方法對(duì)比
與傳統(tǒng)的精確計(jì)數(shù)方法相比,HyperLogLog 在處理大數(shù)據(jù)集時(shí)占用極少的內(nèi)存。例如,一個(gè)包含數(shù)億唯一元素的數(shù)據(jù)集可能只需要幾百字節(jié)的內(nèi)存來(lái)估算其大小。且最大只會(huì)使用 12 KB 的內(nèi)存。
Redis 中的 HyperLogLog
1、Redis 與 HyperLogLog
在 Redis 中,HyperLogLog 提供了一些基本命令來(lái)處理這種類型的數(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%,這對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō)已經(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)用場(chǎng)景
1、計(jì)算網(wǎng)站某個(gè)功能的 UV,比如說(shuō)某個(gè)網(wǎng)站的日訪客數(shù)據(jù)。比如:有多少獨(dú)立用戶播放過(guò)這首歌?這一天該頁(yè)面的獨(dú)立訪問次數(shù)有多少?有多少獨(dú)立用戶觀看過(guò)該視頻?
2、社交媒體平臺(tái)可以用它來(lái)估算獨(dú)特用戶的參與度。
案例研究
在這部分,我們可以探討一個(gè)基于真實(shí)數(shù)據(jù)的案例,展示如何在一個(gè) ToC 業(yè)務(wù)中計(jì)算某個(gè)功能的使用 UV(唯一訪問用戶數(shù)),使用 Redis HyperLogLog 來(lái)實(shí)現(xiàn)。
要使用 Redis HyperLogLog 來(lái)統(tǒng)計(jì)每天展示的 UV,并根據(jù)用戶手機(jī)的設(shè)備 UID 進(jìn)行跟蹤,你可以按照以下步驟實(shí)現(xiàn):
設(shè)置 Redis HyperLogLog: 對(duì)于每個(gè)用戶訪問,你可以使用 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)來(lái)跟蹤 UID。
業(yè)務(wù)ID + 日期為鍵: 使用日期作為鍵的一部分,這樣你可以對(duì)每天的訪問進(jìn)行獨(dú)立計(jì)數(shù)。
Java 代碼實(shí)現(xiàn): 使用 Jedis,這是一個(gè)流行的 Java Redis 客戶端,來(lái)與 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è)知識(shí)點(diǎn)。它可以用來(lái)解決緩存穿透的問題,可以判斷 Redis key 是否在 DB 中,從而避免請(qǐng)求 DB 中不存在的數(shù)據(jù),造成 DB 壓力。
它可以使用很小的空間,存儲(chǔ)大規(guī)模的數(shù)據(jù)。它的特點(diǎn)是:判斷存在不一定存在,但是判斷不存在,一定不存在!
但是 Redis HyperLogLog,很多人都不知道,但是在計(jì)算大規(guī)模數(shù)據(jù)的唯一數(shù)據(jù)量級(jí)的場(chǎng)景下,這是一個(gè)既高效又節(jié)省空間的方法。
以上就是Redis HyperLogLog數(shù)據(jù)統(tǒng)計(jì)輕量級(jí)解決方案詳解的詳細(xì)內(nèi)容,更多關(guān)于Redis HyperLogLog數(shù)據(jù)統(tǒng)計(jì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis+IDEA實(shí)現(xiàn)單機(jī)鎖和分布式鎖的過(guò)程
這篇文章主要介紹了Redis+IDEA實(shí)現(xiàn)單機(jī)鎖和分布式鎖的過(guò)程,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07詳談redis跟數(shù)據(jù)庫(kù)的數(shù)據(jù)同步問題
文章討論了在Redis和數(shù)據(jù)庫(kù)數(shù)據(jù)一致性問題上的解決方案,主要比較了先更新Redis緩存再更新數(shù)據(jù)庫(kù)和先更新數(shù)據(jù)庫(kù)再更新Redis緩存兩種方案,文章指出,刪除Redis緩存后再更新數(shù)據(jù)庫(kù)的方案更優(yōu),因?yàn)樗梢员苊鈹?shù)據(jù)不一致的問題,但可能產(chǎn)生高并發(fā)問題2025-01-01Redis配置文件redis.conf詳細(xì)配置說(shuō)明
本文列出了Redis的配置文件redis.conf的各配置項(xiàng)的詳細(xì)說(shuō)明,簡(jiǎn)單易懂2018-03-03Redis數(shù)據(jù)結(jié)構(gòu)之鏈表詳解
大家好,本篇文章主要講的是Redis數(shù)據(jù)結(jié)構(gòu)之鏈表詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Redis集群擴(kuò)容的實(shí)現(xiàn)示例
本文介紹了在虛擬機(jī)上新建Redis集群,并將新增節(jié)點(diǎn)加入現(xiàn)有集群,通過(guò)配置文件和`redis-cli`命令,成功實(shí)現(xiàn)了Redis集群的擴(kuò)容,感興趣的可以了解一下2025-02-02