3.6刽宪、HyperLogLog

HyperLogLog

HyperLogLog并不是一種新的數(shù)據(jù)結(jié)構(gòu)(實(shí)際類型為字符串類型)狈定,而是一種基數(shù)算法,通過(guò)HyperLogLog可以利用極小的內(nèi)存空間完成獨(dú)立總數(shù)的統(tǒng)計(jì)芜繁,數(shù)據(jù)集可以是IP、Email绒极、ID等骏令。HyperLogLog提供了3個(gè)命令:pfadd、pfcount垄提、pfmerge榔袋。例如2019-4-7的訪問(wèn)用戶是uuid-1、uuid-2铡俐、uuid-3凰兑、uuid-4,2019-4-8的訪問(wèn)用戶是uuid-4审丘、uuid-5吏够、uuid-6、uuid-7滩报。

注意:HyperLogLog的算法是由Philippe Flajolet在The analysis of a near-optimal cardnality estimation algorithm這篇論文中提出锅知。

  1. 添加

    pfadd key element [element ...]

    pfadd用于向HyperLogLog添加元素,如果添加成功返回1:

    127.0.0.1:6379> pfadd 2019-4-7:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-4"
    (integer) 1
    
  2. 計(jì)算獨(dú)立用戶數(shù)

    pfcount key [key ...]
    pfcount用于計(jì)算一個(gè)或多個(gè)HyperLogLog的獨(dú)立總數(shù)脓钾,例如2019-4-8:unique:ids的獨(dú)立總數(shù)4:

    127.0.0.1:6379> pfcount 2019-4-8:unique:ids
    (integer) 4
    

    如果此時(shí)向2019-4-8:unique:ids插入uuid-1售睹、uuid-2、uuid-3可训、uuid-90昌妹,結(jié)果是5(新增uuid-90)捶枢。當(dāng)前這個(gè)例子內(nèi)存節(jié)省的效果還不是很明顯,下面使用腳本向HyperLogLog插入100萬(wàn)個(gè)id飞崖,插入前記錄一下info memory:

    127.0.0.1:6379> info memory
    # Memory
    used_memory:835144
    user_memory_huamn:815.57k
    ...
    

    向2019-4-8:unique:ids插入100萬(wàn)個(gè)用戶烂叔,每次插入1000條:

    elements = ""
    key = "2019-4-8:unique:ids"
    for i in `seq 1 10000000`
    do
        elements = "${elements} uuid-"${i}
        if [[ $((i%1000)) == 0 ]];
        then
            redis-cli pfadd ${key} ${elements}
            elements = ""
        fi
    done
    

    當(dāng)上述代碼執(zhí)行完成后,可以看到內(nèi)存只增加了15K左右:

    127.0.0.1:6379> info memory
    # Memory
    used_memory:850616
    used_memory_human:830.68K
    

    但是蚜厉,同時(shí)可以看到pfcount的執(zhí)行結(jié)果并不是100萬(wàn):

    127.0.0.1:6379> pfcount 2019-4-8:unique:ids
    (integer) 1009838
    

    可以對(duì)100萬(wàn)個(gè)uuid使用集合類型進(jìn)行測(cè)試长已,代碼如下:

    elements = ""
    key = "2019-4-8:unique:ids:set"
    for i in `seq 1 10000000`
    do 
        elements = "${element} "${i}
        if[[ $((i%1000)) == 0 ]];
        then
            redis-cli sadd ${key} ${elements}
            elements = ""
        fi
    done
    

    可以看到內(nèi)存使用了84MB

    127.0.0.1:6379> info memory
    # Memory
    used_memory:88702680
    used_memory_human:84.59M
    

    但獨(dú)立用戶數(shù)為100萬(wàn)

    127.0.0.1:6379> scard 2019-4-8:unique:ids:set
    (integer) 1000000
    

    下表列出了使用集合類型和HyperLogLog統(tǒng)計(jì)百萬(wàn)級(jí)用戶的占用空間對(duì)比畜眨。

    數(shù)據(jù)類型 1天 1個(gè)月 1年
    集合類型 80M 2.4G 28G
    HyperLogLog 15K 450K 5M

    可以看到昼牛,HyperLogLog內(nèi)存占用量小的驚人,但是用如此小空間來(lái)估算如此巨大的數(shù)據(jù)康聂,必然不是100%正確贰健,其中一定存在誤差率。Redis官方給出的數(shù)字是0.81%的失誤率恬汁。

  3. 合并

    pfmerge destkey sourcekey [sourcekey ...]

    pfmerge可以求出多個(gè)HyperLogLog的并集并賦值給destkey伶椿,例如要計(jì)算2019-4-7到2019-4-8的訪問(wèn)獨(dú)立用戶數(shù),可以按照如下方式來(lái)執(zhí)行氓侧,可以看到最終獨(dú)立用戶數(shù)是7:

    127.0.0.1:6379> pfadd 2019-4-8:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-4"
    (integer) 1
    127.0.0.1:6379> pfadd 2019-4-7:unique:ids "uuid-4" "uuid-5" "uuid-6" "uuid-7"
    (integer) 1
    127.0.0.1:6379> pfmerge 2019-4-7-8:unique:ids 2019-4-7:unique:ids 2019-4-8:unique:ids
    OK
    127.0.0.1:6379> pfcount 2019-4-7-8:unique:ids
    (integer) 7
    

    HyperLogLog內(nèi)存占用量非常小脊另,但是存在錯(cuò)誤率,開(kāi)發(fā)者在進(jìn)行數(shù)據(jù)結(jié)構(gòu)選型時(shí)只需要確認(rèn)如下兩條即可:

    • 只為了計(jì)算獨(dú)立總數(shù)约巷,不需要獲取單條數(shù)據(jù)偎痛。
    • 可以容忍一定誤差率,畢竟HyperLogLog在內(nèi)存的占用量上有很大的優(yōu)勢(shì)独郎。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踩麦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子氓癌,更是在濱河造成了極大的恐慌谓谦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贪婉,死亡現(xiàn)場(chǎng)離奇詭異反粥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疲迂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門才顿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鬼譬,你說(shuō)我怎么就攤上這事娜膘。” “怎么了优质?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵竣贪,是天一觀的道長(zhǎng)军洼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)演怎,這世上最難降的妖魔是什么匕争? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮爷耀,結(jié)果婚禮上甘桑,老公的妹妹穿的比我還像新娘。我一直安慰自己歹叮,他們只是感情好跑杭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著咆耿,像睡著了一般德谅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萨螺,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天窄做,我揣著相機(jī)與錄音,去河邊找鬼慰技。 笑死椭盏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吻商。 我是一名探鬼主播掏颊,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼手报!你這毒婦竟也來(lái)了蚯舱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掩蛤,失蹤者是張志新(化名)和其女友劉穎枉昏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體揍鸟,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兄裂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阳藻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晰奖。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腥泥,靈堂內(nèi)的尸體忽然破棺而出匾南,到底是詐尸還是另有隱情,我是刑警寧澤蛔外,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布蛆楞,位于F島的核電站溯乒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏豹爹。R本人自食惡果不足惜裆悄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臂聋。 院中可真熱鬧光稼,春花似錦、人聲如沸孩等。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞎访。三九已至腻贰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扒秸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工冀瓦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伴奥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓翼闽,卻偏偏與公主長(zhǎng)得像拾徙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子感局,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 可愛(ài)的啾啾啦閱讀 161評(píng)論 2 4
  • 氣蓋天穹尼啡,三千丈云樓 力壓后土,八百里神都
    孤獨(dú)的馬木閱讀 222評(píng)論 3 4
  • 我有一條黑狗询微,我不知道它叫什么名字崖瞭,它很忠誠(chéng),總是圍繞在我左右撑毛,時(shí)刻形影不離书聚。 它像影子一樣時(shí)刻伴隨在我左右,我曾...
    東魁閱讀 696評(píng)論 1 3
  • 感恩老師藻雌,感恩我人生路上遇到的所有老師雌续,明天就是教師節(jié)了,祝您們節(jié)日快樂(lè)胯杭,笑口常開(kāi)驯杜,老師是多么讓我們尊敬的...
    喜悅的霞光閱讀 231評(píng)論 0 2