Redis中HyperLogLog的使用詳情
前言
HyperLogLog ,基數(shù)統(tǒng)計(jì);
那什么是基數(shù)?
比如有兩個(gè)數(shù)組
數(shù)組A = [1,2,3,4,5];
數(shù)組B = [3,4,5,6,7];
這時(shí)候基數(shù)就是 [1,2,3,4,5,6,7],總共有7個(gè)數(shù);
就是去重之后的數(shù)據(jù);
HyperLogLog 就是用來(lái)做去重復(fù)統(tǒng)計(jì)的;
bitmap 在做統(tǒng)計(jì)時(shí),雖然使用的是 bit 來(lái)做記錄,已經(jīng)很節(jié)省空間了;
但是在隨著數(shù)據(jù)量快速增長(zhǎng)的情況下,bitmap 也是很占內(nèi)存空間的;
而 HyperLogLog 就不同了,HyperLogLog 的每個(gè) key 只占用 12kb 的內(nèi)存,
就可以統(tǒng)計(jì) 2的64 次方個(gè)基數(shù);
而且不會(huì)隨著數(shù)據(jù)量的增多而變大,就是固定的 12kb;
這是因?yàn)?nbsp;HyperLogLog 每次只會(huì)根據(jù)添加的數(shù)據(jù)去計(jì)算基數(shù),而不保存添加的數(shù)據(jù)本身;
但這也造成了一個(gè)問(wèn)題,就是 HyperLogLog 基數(shù)統(tǒng)計(jì)的準(zhǔn)確率不是100%,會(huì)有 0.81% 的誤差;
但對(duì)于億級(jí)數(shù)據(jù)的統(tǒng)計(jì),這點(diǎn)誤差似乎可以忽略不計(jì);
同樣的,bitmap 記錄數(shù)據(jù)本身,它的計(jì)算是精確的;
所有,也可以說(shuō) HyperLogLog 是一種概率計(jì)算,但是誤差是很小的。
這是reidis作者寫(xiě)的關(guān)于HyperLogLog的文章
HyperLogLog 的使用也非常簡(jiǎn)單,就3個(gè)操作api
添加元素
pfadd key value [value ...]
pfadd 20220628:uv ip1 ip2 ip3 pfadd 20220629:uv ip1 ip2 ip3 ip4 ip5 pfadd 20220630:uv ip2 ip4 ip5 ip6 ip7 ip8
重復(fù)數(shù)據(jù)不會(huì)被保存,返回的是0
> pfadd 20220628:uv ip1 ip2 ip3 1 > pfadd 20220628:uv ip1 ip2 ip3 0
- 獲取 HyperLogLog 的基數(shù)估算值
PFCOUNT key [key ...]
> pfcount 20220628:uv 20220629:uv 5
合并得出的不會(huì)被儲(chǔ)存,使用之后就會(huì)被刪掉
- 合并多個(gè)key
pfmerge destkey key [key ...]
> pfmerge result 20220628:uv 20220629:uv 20220630:uv OK
pfmerge 合并多個(gè)key后,會(huì)生成一條 result 數(shù)據(jù)
然后再對(duì) result 做 pfcount 操作
> pfcount result 8
這時(shí)候拿到的值就是 上面3個(gè)key 計(jì)算出來(lái)的基數(shù)。
HyperLogLog 在 spring 里的使用也非常簡(jiǎn)單,
pfadd 對(duì)應(yīng)的是 .add() 操作;
pfcount 對(duì)應(yīng)的是 .size() 操作;
pfmerge 對(duì)應(yīng)的是 .union() 操作;
下面是使用的 Demo
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.HyperLogLogOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@SpringBootTest
@RunWith(SpringRunner.class)
class RedisTest {
@Resource
private RedisTemplate<String, String> redisTemplate;
@Test
void hyperLogLogTest() {
HyperLogLogOperations<String, String> hyperLogLogOperations = redisTemplate.opsForHyperLogLog();
// 添加元素
Long add = hyperLogLogOperations.add("20220628:uv", "ip1", "ip2", "ip3");
System.out.println("add : " + add);
hyperLogLogOperations.add("20220629:uv", "ip1", "ip2", "ip3", "ip4", "ip5");
hyperLogLogOperations.add("20220630:uv", "ip2", "ip4", "ip5", "ip6", "ip7", "ip8");
// 獲取元素基數(shù)
Long size = hyperLogLogOperations.size("20220628:uv", "20220629:uv");
System.out.println("size : " + size);
// 合并多個(gè)元素
Long result = hyperLogLogOperations.union("unionResult", "20220628:uv", "20220629:uv", "20220630:uv");
System.out.println("result : " + result);
Long unionResult = hyperLogLogOperations.size("unionResult");
System.out.println("unionResult : " + unionResult);
}
}到此這篇關(guān)于Redis中HyperLogLog的使用詳情的文章就介紹到這了,更多相關(guān)RedisH yperLogLog內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis中HyperLogLog的使用小結(jié)
- Redis?HyperLogLog數(shù)據(jù)統(tǒng)計(jì)輕量級(jí)解決方案詳解
- Redis中?HyperLogLog數(shù)據(jù)類(lèi)型使用小結(jié)
- Redis如何使用HyperLogLog的實(shí)現(xiàn)
- Redis特殊數(shù)據(jù)類(lèi)型HyperLogLog基數(shù)統(tǒng)計(jì)算法講解
- Redis高級(jí)數(shù)據(jù)類(lèi)型Hyperloglog、Bitmap的使用
- Redis中3種特殊的數(shù)據(jù)類(lèi)型(BitMap、Geo和HyperLogLog)
- Redis?HyperLogLog數(shù)據(jù)量統(tǒng)計(jì)的實(shí)現(xiàn)實(shí)例
相關(guān)文章
Redis異步隊(duì)列的實(shí)現(xiàn)及應(yīng)用場(chǎng)景
異步隊(duì)列是一種底層基于異步 I/O 模型的消息隊(duì)列,用于在分布式系統(tǒng)中進(jìn)行同步和異步的通訊和協(xié)作,本文主要介紹了Redis異步隊(duì)列的實(shí)現(xiàn)及應(yīng)用場(chǎng)景,感興趣的可以了解一下2023-12-12
了解redis中RDB結(jié)構(gòu)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了redis中RDB結(jié)構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Redis緩存過(guò)期的實(shí)現(xiàn)示例
Redis緩存的過(guò)期策略是保證緩存可靠性和性能的關(guān)鍵之一,本文主要介紹了Redis緩存過(guò)期的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
redis客戶端實(shí)現(xiàn)高可用讀寫(xiě)分離的方式詳解
基于sentienl 獲取和動(dòng)態(tài)感知 master、slaves節(jié)點(diǎn)信息的變化,我們的讀寫(xiě)分離客戶端就能具備高可用+動(dòng)態(tài)擴(kuò)容感知能力了,接下來(lái)通過(guò)本文給大家分享redis客戶端實(shí)現(xiàn)高可用讀寫(xiě)分離的方式,感興趣的朋友一起看看吧2021-07-07
Redis報(bào)錯(cuò)NOAUTH?Authentication?required簡(jiǎn)單解決辦法
這篇文章主要給大家介紹了關(guān)于Redis報(bào)錯(cuò)NOAUTH?Authentication?required的簡(jiǎn)單解決辦法,Redis無(wú)密碼報(bào)錯(cuò)NOAUTH Authentication required的原因是客戶端訪問(wèn)Redis時(shí)需要提供密碼,但是沒(méi)有提供或提供的密碼不正確,需要的朋友可以參考下2024-05-05
如何向redis中寫(xiě)入大量的數(shù)據(jù)
文章介紹了通過(guò)Python腳本生成Redis命令并輸出至文件,再用Shell腳本批量執(zhí)行的流程,強(qiáng)調(diào)Pipeline技術(shù)可提升批量寫(xiě)入效率,并說(shuō)明如何驗(yàn)證數(shù)據(jù)插入成功2025-08-08
k8s部署redis集群實(shí)現(xiàn)過(guò)程實(shí)例詳解
這篇文章主要為大家介紹了k8s部署redis集群實(shí)現(xiàn)過(guò)程實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Redis集群的三種部署方式及三種應(yīng)用問(wèn)題的處理
這篇文章主要介紹了Redis集群的三種部署方式及三種應(yīng)用問(wèn)題的處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
解讀redis?slaveof命令執(zhí)行后為什么需要清庫(kù)重新同步
這篇文章主要介紹了redis?slaveof命令執(zhí)行后為什么需要清庫(kù)重新同步,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04

