【SpringBoot DB 系列】Redis 高級特性之 HyperLoglog

image

【SpringBoot DB 系列】Redis 高級特性之 HyperLoglog

hyperloglog 算法节预,利用非常少的空間格了,實現(xiàn)比較大的數(shù)據(jù)量級統(tǒng)計;比如我們前面在介紹 bitmap 的過程中系瓢,說到了日活的統(tǒng)計慷垮,當數(shù)據(jù)量達到百萬時揖闸,最佳的存儲方式是 hyperloglog,本文將介紹一下 hyperloglog 的基本原理料身,以及 redis 中的使用姿勢

I. 基本使用

1. 配置

我們使用 SpringBoot 2.2.1.RELEASE來搭建項目環(huán)境汤纸,直接在pom.xml中添加 redis 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果我們的 redis 是默認配置,則可以不額外添加任何配置芹血;也可以直接在application.yml配置中贮泞,如下

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:

2. 使用姿勢

我們下來看使用姿勢,原理放在后面說明

redis 中幔烛,hyperlolog使用非常簡單啃擦,一般就兩個操作命令,添加pfadd + 計數(shù)pfcount饿悬;另外還有一個不常用的merge

a. add

添加一條記錄

public boolean add(String key, String obj) {
    // pfadd key obj
    return stringRedisTemplate.opsForHyperLogLog().add(key, obj) > 0;
}

b. pfcount

非精準的計數(shù)統(tǒng)計

public long count(String key) {
    // pfcount 非精準統(tǒng)計 key的計數(shù)
    return stringRedisTemplate.opsForHyperLogLog().size(key);
}

a. merge

將多個 hyperloglog 合并成一個新的 hyperloglog令蛉;感覺用的場景并不會特別多

public boolean merge(String out, String... key) {
    // pfmerge out key1 key2  ---> 將key1 key2 合并成一個新的hyperloglog out
    return stringRedisTemplate.opsForHyperLogLog().union(out, key) > 0;
}

3. 原理說明

關(guān)于 HyperLogLog 的原理我這里也不進行詳細贅述,說實話那一套算法以及調(diào)和平均公式我自己也沒太整明白乡恕;下面大致說一下我個人的樸素理解

Redis 中的 HyperLogLog 一共分了2^14=16384個桶言询,每個桶占 6 個 bit

一個數(shù)據(jù)俯萎,塞入 HyperLogLog 之前,先 hash 一下运杭,得到一個 64 位的二進制數(shù)據(jù)

  • 取低 14 位夫啊,用來定位桶的 index
  • 高 50 位,從低到高數(shù)辆憔,找到第一個為 1 出現(xiàn)的位置 n
    • 若桶中值 > n撇眯,則丟掉
    • 反之,則設(shè)置桶中的值為 n

那么怎么進行計數(shù)統(tǒng)計呢虱咧?

  • 拿所有桶中的值熊榛,代入下面的公式進行計算
image

上面這個公式怎么得出的?

之前看到一篇文章,感覺不錯腕巡,有興趣了解原理的玄坦,可以移步: http://www.reibang.com/p/55defda6dcd2

4. 應(yīng)用場景

hyperloglog通常是用來非精確的計數(shù)統(tǒng)計,前面介紹了日活統(tǒng)計的 case绘沉,當時使用的是 bitmap 來作為數(shù)據(jù)統(tǒng)計煎楣,然而當 userId 分散不均勻,小的特別小车伞,大的特別大的時候择懂,并不適用

在數(shù)據(jù)量級很大的情況下,hyperloglog的優(yōu)勢非常大另玖,它所占用的存儲空間是固定的2^14
下圖引用博文《用戶日活月活怎么統(tǒng)計》

image

使用 HyperLogLog 進行日活統(tǒng)計的設(shè)計思路比較簡單

  • 每日生成一個 key
  • 某個用戶訪問之后困曙,執(zhí)行 pfadd key userId
  • 統(tǒng)計總數(shù): pfcount key

II. 其他

0. 項目

系列博文

工程源碼

1. 一灰灰 Blog

盡信書則不如,以上內(nèi)容谦去,純屬一家之言慷丽,因個人能力有限,難免有疏漏和錯誤之處哪轿,如發(fā)現(xiàn) bug 或者有更好的建議盈魁,歡迎批評指正,不吝感激

下面一灰灰的個人博客窃诉,記錄所有學習和工作中的博文,歡迎大家前去逛逛

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赤套,一起剝皮案震驚了整個濱河市飘痛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌容握,老刑警劉巖宣脉,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剔氏,居然都是意外死亡塑猖,警方通過查閱死者的電腦和手機竹祷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羊苟,“玉大人塑陵,你說我怎么就攤上這事±” “怎么了令花?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凉倚。 經(jīng)常有香客問我兼都,道長,這世上最難降的妖魔是什么稽寒? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任扮碧,我火速辦了婚禮,結(jié)果婚禮上杏糙,老公的妹妹穿的比我還像新娘芬萍。我一直安慰自己,他們只是感情好搔啊,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布柬祠。 她就那樣靜靜地躺著,像睡著了一般负芋。 火紅的嫁衣襯著肌膚如雪漫蛔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天旧蛾,我揣著相機與錄音莽龟,去河邊找鬼。 笑死锨天,一個胖子當著我的面吹牛毯盈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播病袄,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搂赋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了益缠?” 一聲冷哼從身側(cè)響起脑奠,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幅慌,沒想到半個月后宋欺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年齿诞,在試婚紗的時候發(fā)現(xiàn)自己被綠了酸休。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡祷杈,死狀恐怖斑司,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吠式,我是刑警寧澤陡厘,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站特占,受9級特大地震影響糙置,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜是目,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一谤饭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懊纳,春花似錦揉抵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茂缚,卻和暖如春戏罢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脚囊。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工龟糕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悔耘。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓讲岁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衬以。 傳聞我的和親對象是個殘疾皇子缓艳,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355