Redis中HyperLogLog的使用詳情
前言
HyperLogLog ,基數(shù)統(tǒng)計;
那什么是基數(shù)?
比如有兩個數(shù)組
數(shù)組A = [1,2,3,4,5];
數(shù)組B = [3,4,5,6,7];
這時候基數(shù)就是 [1,2,3,4,5,6,7],總共有7個數(shù);
就是去重之后的數(shù)據(jù);
HyperLogLog 就是用來做去重復(fù)統(tǒng)計的;
bitmap 在做統(tǒng)計時,雖然使用的是 bit 來做記錄,已經(jīng)很節(jié)省空間了;
但是在隨著數(shù)據(jù)量快速增長的情況下,bitmap 也是很占內(nèi)存空間的;
而 HyperLogLog 就不同了,HyperLogLog 的每個 key 只占用 12kb 的內(nèi)存,
就可以統(tǒng)計 2的64 次方個基數(shù);
而且不會隨著數(shù)據(jù)量的增多而變大,就是固定的 12kb;
這是因為 HyperLogLog 每次只會根據(jù)添加的數(shù)據(jù)去計算基數(shù),而不保存添加的數(shù)據(jù)本身;
但這也造成了一個問題,就是 HyperLogLog 基數(shù)統(tǒng)計的準(zhǔn)確率不是100%,會有 0.81% 的誤差;
但對于億級數(shù)據(jù)的統(tǒng)計,這點誤差似乎可以忽略不計;
同樣的,bitmap 記錄數(shù)據(jù)本身,它的計算是精確的;
所有,也可以說 HyperLogLog 是一種概率計算,但是誤差是很小的。
這是reidis作者寫的關(guān)于HyperLogLog的文章
HyperLogLog 的使用也非常簡單,就3個操作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ù)不會被保存,返回的是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
合并得出的不會被儲存,使用之后就會被刪掉
- 合并多個key
pfmerge destkey key [key ...]
> pfmerge result 20220628:uv 20220629:uv 20220630:uv OK
pfmerge 合并多個key后,會生成一條 result 數(shù)據(jù)
然后再對 result 做 pfcount 操作
> pfcount result 8
這時候拿到的值就是 上面3個key 計算出來的基數(shù)。
HyperLogLog 在 spring 里的使用也非常簡單,
pfadd 對應(yīng)的是 .add() 操作;
pfcount 對應(yīng)的是 .size() 操作;
pfmerge 對應(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); // 合并多個元素 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
window環(huán)境redis通過AOF恢復(fù)數(shù)據(jù)的方法
這篇文章主要介紹了window環(huán)境redis通過AOF恢復(fù)數(shù)據(jù)的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11CentOS系統(tǒng)中Redis數(shù)據(jù)庫的安裝配置指南
Redis是一個基于主存存儲的數(shù)據(jù)庫,性能很強,這里我們就來看一下CentOS系統(tǒng)中Redis數(shù)據(jù)庫的安裝配置指南,包括將Redis作為系統(tǒng)服務(wù)運行的技巧等,需要的朋友可以參考下2016-06-06Redis分布式鎖的實現(xiàn)方式(redis面試題)
這篇文章主要介紹了Redis分布式鎖的實現(xiàn)方式(面試常見),需要的朋友可以參考下2020-01-01redis中使用redis-dump導(dǎo)出、導(dǎo)入、還原數(shù)據(jù)實例
這篇文章主要介紹了redis中使用redis-dump導(dǎo)出、導(dǎo)入、還原數(shù)據(jù)實例,本文直接給出操作命令,并給出注釋加以說明,需要的朋友可以參考下2014-11-11