Redis中?HyperLogLog數(shù)據(jù)類型使用小結(jié)
1. HyperLogLog 的原理
Redis HyperLogLog基于一種稱為HyperLogLog算法的概率性算法來估計(jì)基數(shù)。 HyperLogLog使用一個長度為m的位數(shù)組和一些hash函數(shù)來估計(jì)集合中的唯一元素?cái)?shù)。
在 HyperLogLog 算法中,對每個元素進(jìn)行哈希處理,把哈希值轉(zhuǎn)換為二進(jìn)制后,根據(jù)二進(jìn)制串前綴中 1 的個數(shù)來給每個元素打分。例如,一個元素的哈希值為01110100011,那么前綴中1的個數(shù)是3,因此在 HyperLogLog 算法中,這個元素的分?jǐn)?shù)為3。
當(dāng)所有元素的分?jǐn)?shù)統(tǒng)計(jì)完之后,取每一個分?jǐn)?shù)的倒數(shù)(1 / 2^n),然后將這些倒數(shù)相加后取倒數(shù),就得到一個基數(shù)估計(jì)值,這個值就是HyperLogLog算法的估計(jì)結(jié)果。
HyperLogLog算法通過對位數(shù)組的長度m的大小進(jìn)行取舍,折衷數(shù)據(jù)結(jié)構(gòu)占用的內(nèi)存與估計(jì)值的精準(zhǔn)度(即估計(jì)誤差),得到了在數(shù)據(jù)占用空間與錯誤較小程度之間完美的平衡。
簡而言之,HyperLogLog算法的核心思想是基于哈希函數(shù)和位運(yùn)算,通過將哈希值轉(zhuǎn)換成比特流并統(tǒng)計(jì)前導(dǎo)0的個數(shù),從而快速估算大型數(shù)據(jù)集中唯一值的數(shù)量。通過 hyperloglog 算法我們可以在非常大的數(shù)據(jù)集中進(jìn)行極速的網(wǎng)頁瀏覽器去重。
2.使用步驟:
Redis HyperLogLog是一種可用于估算集合中元素?cái)?shù)量的數(shù)據(jù)結(jié)構(gòu),它能夠通過使用非常少的內(nèi)存來維護(hù)海量的數(shù)據(jù)。它的精確度要比使用一般的估計(jì)算法高,并且在處理大量數(shù)據(jù)時的速度也非常快。
一個簡單的例子,我們可以用HyperLogLog來計(jì)算訪問網(wǎng)站的獨(dú)立IP數(shù),具體可以按以下步驟操作:
- 首先創(chuàng)建一個HyperLogLog數(shù)據(jù)結(jié)構(gòu):
PFADD hll:unique_ips 127.0.0.1
- 為每次訪問ip添加到unique_ips數(shù)據(jù)結(jié)構(gòu)中:
PFADD hll:unique_ips 192.168.1.1
- 獲取計(jì)算集合中元素?cái)?shù)量的近似值:
PFCOUNT hll:unique_ips
- 可以通過對多個HyperLogLog結(jié)構(gòu)(例如按天或按小時)的合并,來獲得更精確的計(jì)數(shù)。
需要注意的是,HyperLogLog雖然可以節(jié)省大量的內(nèi)存,但它是一種估計(jì)算法,誤差范圍并不是完全精確的,實(shí)際使用時應(yīng)注意其適用范圍。
3.實(shí)現(xiàn)請求ip去重的瀏覽量使用示例
4.Jedis客戶端使用
1. 添加依賴,引入jedis依賴:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.6.0</version> </dependency>
2.創(chuàng)建一個Jedis對象:
Jedis jedis = new Jedis("localhost");
3.向HyperLogLog數(shù)據(jù)結(jié)構(gòu)添加元素:
jedis.pfadd("hll:unique_ips", "127.0.0.1");
4.獲取計(jì)算集合中元素?cái)?shù)量的近似值:
Long count = jedis.pfcount("hll:unique_ips"); System.out.println(count);
5.可以通過對多個HyperLogLog結(jié)構(gòu)的合并來獲得更精確的計(jì)數(shù)。在Jedis中可以使用PFMERGE
命令來合并HyperLogLog數(shù)據(jù)結(jié)構(gòu):
jedis.pfmerge("hll:unique_ips", "hll:unique_ips1", "hll:unique_ips2", "hll:unique_ips3");
5.Redission使用依賴
1.創(chuàng)建RedissonClient對象
Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379"); RedissonClient redisson = Redisson.create(config);
2.創(chuàng)建RHyperLogLog對象
RHyperLogLog<String> uniqueIps = redisson.getHyperLogLog("hll:unique_ips");
3.添加元素
uniqueIps.add("127.0.0.1");
4..獲取近似數(shù)量
long approximateCount = uniqueIps.count(); System.out.println(approximateCount);
5.合并多個HyperLogLog對象
RHyperLogLog<String> uniqueIps1 = redisson.getHyperLogLog("hll:unique_ips1"); RHyperLogLog<String> uniqueIps2 = redisson.getHyperLogLog("hll:unique_ips2"); uniqueIps.mergeWith(uniqueIps1, uniqueIps2);
6.HyperLogLog 提供了哪些特性和方法
特性:
- 精確度低,但占用內(nèi)存極少。
- 支持插入新元素,同時不會重復(fù)計(jì)數(shù)。
- 提供指令來優(yōu)化內(nèi)存使用和計(jì)數(shù)準(zhǔn)確性。例如PFADD、PFCOUNT、PFMERGE等指令。
- 能夠估計(jì)一個數(shù)據(jù)集中的不同元素?cái)?shù)量,即集合的基數(shù)(cardinality)。
- 支持對多個HyperLogLog對象進(jìn)行合并操作,以獲得這些集合的總基數(shù)的近似值。
HyperLogLog常用的方法:
- PFADD key element [element ...]:添加一個或多個元素到HyperLogLog結(jié)構(gòu)中。
- PFCOUNT key [key ...]:獲取一個或多個HyperLogLog結(jié)構(gòu)的基數(shù)估計(jì)值。
- PFMERGE destkey sourcekey [sourcekey ...]:合并一個或多個HyperLogLog結(jié)構(gòu)到一個目標(biāo)結(jié)構(gòu)中。
- PFSELFTEST [numtests]: 測試HyperLogLog估值性能和準(zhǔn)確性(僅限Redis4.0+版本)
需要注意的是,HyperLogLog雖然可以節(jié)省大量內(nèi)存,但仍然是一種估計(jì)算法,誤差范圍并不是完全精確的,并且具有一定的計(jì)算成本。在使用時需要根據(jù)實(shí)際應(yīng)用情況選擇是否使用HyperLogLog或其他數(shù)據(jù)結(jié)構(gòu)來估計(jì)元素?cái)?shù)量。
7.使用場景總結(jié):
Redis使用HyperLogLog的主要作用是在大數(shù)據(jù)流(view,IP,城市)的情況下進(jìn)行去重計(jì)數(shù)。
具體來說,以下是Redis HyperLogLog用于去重計(jì)數(shù)的一些場景:
- 統(tǒng)計(jì)頁面訪問量 - 在Web應(yīng)用程序中, HyperLogLog可以使用為每個頁面計(jì)算多少次獨(dú)特的訪問者。通過跨越多個不同的時間段使用HyperLogLog,可以計(jì)算出這個頁面的所有時間的平均訪問數(shù)。
- 統(tǒng)計(jì)用戶數(shù) - 在分析大數(shù)據(jù)集合的用戶數(shù)量方面,HyperLogLog也非常有用。作為一種基于概率的數(shù)據(jù)結(jié)構(gòu),尤其是在處理獨(dú)特的用戶ID這樣的數(shù)據(jù)集合時。在此情況下,HyperLogLog首先執(zhí)行散列,此后僅在內(nèi)部存儲有限的散列值,同時還能夠推斷大小。
- 統(tǒng)計(jì)廣告點(diǎn)擊量 - 對于網(wǎng)站或應(yīng)用程序的廣告分析,HyperLogLog可以用于捕獲有效點(diǎn)擊數(shù)量,即非重復(fù)或唯一點(diǎn)擊數(shù)量。
總之,對于需要進(jìn)行去重計(jì)數(shù)的大數(shù)據(jù)流的情況下,Redis的HyperLogLog是一種簡單而強(qiáng)大的工具。
到此這篇關(guān)于Redis中 HyperLogLog數(shù)據(jù)類型使用總結(jié)的文章就介紹到這了,更多相關(guān)Redis HyperLogLog數(shù)據(jù)類型使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis 如何批量設(shè)置過期時間(PIPLINE的使用)
有時候我們并不希望redis的key一直存在。例如緩存,驗(yàn)證碼等數(shù)據(jù),我們希望它們能在一定時間內(nèi)自動的被銷毀。本文就詳細(xì)的介紹一下Redis 如何批量設(shè)置過期時間,感興趣的可以了解一下2021-11-11redis實(shí)現(xiàn)好友關(guān)注&消息推送的方法示例
Redis作為一款開源的內(nèi)存數(shù)據(jù)庫,具有可靠性、速度快、易用性等優(yōu)點(diǎn),已經(jīng)被廣泛應(yīng)用于開發(fā)實(shí)際項(xiàng)目中,本文主要介紹了redis實(shí)現(xiàn)好友關(guān)注&消息推送的方法示例,感興趣的可以了解一下2023-10-10解決Redis報(bào)錯MISCONF?Redis?is?configured?to?save?RDB?snap
這篇文章主要給大家介紹了關(guān)于如何解決Redis報(bào)錯MISCONF?Redis?is?configured?to?save?RDB?snapshots的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11python腳本實(shí)現(xiàn)Redis未授權(quán)批量提權(quán)
這篇文章主要給大家介紹了關(guān)于利用python腳本實(shí)現(xiàn)redis未授權(quán)批量提權(quán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09Redis實(shí)現(xiàn)UV統(tǒng)計(jì)的示例代碼
本文主要介紹了Redis實(shí)現(xiàn)UV統(tǒng)計(jì)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01redis安裝和配置_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了redis安裝和配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08Redis分布式鎖的使用和實(shí)現(xiàn)原理詳解
這篇文章主要給大家介紹了關(guān)于Redis分布式鎖的使用和實(shí)現(xiàn)原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11