位圖與HyperLogLog的使用場景是什么锡溯? 二者各自的原理赶舆? 請(qǐng)盡量詳細(xì)的描述

位圖的使用
當(dāng)接到這樣的需求時(shí),第一時(shí)間我想到的就是使用Redis來應(yīng)對(duì)這樣的需求祭饭,用戶一年的簽到記錄芜茵, 簽了是 1,沒簽是 0倡蝙,要記錄 365 天九串。如果使用普通的 key/value,每個(gè)用戶要記錄 365 個(gè)寺鸥,當(dāng)用戶上億的時(shí)候猪钮,需要的存儲(chǔ)空間是驚人的。而這時(shí)Redis的位圖數(shù)據(jù)結(jié)構(gòu)就派上用場了胆建,這樣每天的簽到記錄只占據(jù)一個(gè)位烤低, 365 天就是 365 個(gè)位,一個(gè)字節(jié)是8位笆载,也就是一個(gè)用戶簽到一年扑馁,差不多46 個(gè)字節(jié)就可以完全容納下,這就大大節(jié)約了存儲(chǔ)空間宰译。

位圖不是特殊的數(shù)據(jù)結(jié)構(gòu)檐蚜,它的內(nèi)容其實(shí)就是普通的字符串,也就是 byte 數(shù)組沿侈。我們可以使用普通的 get/set 直接獲取和設(shè)置整個(gè)位圖的內(nèi)容闯第,也可以使用位圖操作 getbit/setbit 等將 byte 數(shù)組看成「位數(shù)組」來處理。

操作:設(shè)置(setbit)和獲茸菏谩(getbit):


圖片.png

操作:統(tǒng)計(jì)(bitcount)和查找(bitpos):


圖片.png

以上就是Redis提供給我們位圖的數(shù)據(jù)結(jié)構(gòu)咳短,當(dāng)然還是其他操作填帽,這里就不再贅述,下面來講一下另外一個(gè)需求咙好,那就是統(tǒng)計(jì)網(wǎng)站的UV數(shù)據(jù)篡腌,當(dāng)接到這樣一個(gè)需求時(shí),相信大部分程序員都會(huì)漏出自信的微笑勾效,我用一個(gè)Redis的計(jì)數(shù)器就可以實(shí)現(xiàn)了嘹悼,其實(shí)不然,如果統(tǒng)計(jì) PV 那非常好辦层宫,給每個(gè)網(wǎng)頁一個(gè)獨(dú)立的 Redis 計(jì)數(shù)器就可以了杨伙,這個(gè)計(jì)數(shù)器 的 key 后綴加上當(dāng)天的日期。這樣來一個(gè)請(qǐng)求萌腿,incrby 一次限匣,最終就可以統(tǒng)計(jì)出所有的 PV 數(shù)據(jù)。但是 UV 不一樣毁菱,它要去重米死,同一個(gè)用戶一天之內(nèi)的多次訪問請(qǐng)求只能計(jì)數(shù)一次。這就 要求每一個(gè)網(wǎng)頁請(qǐng)求都需要帶上用戶的 ID贮庞,無論是登陸用戶還是未登陸用戶都需要一個(gè)唯一 ID 來標(biāo)識(shí)峦筒。可能你會(huì)想到另外一個(gè)簡單的方案贸伐,那就是為每一個(gè)頁面一個(gè)獨(dú)立的 set 集合來存儲(chǔ)所有當(dāng)天訪問過此頁面的用戶 ID勘天。當(dāng)一個(gè)請(qǐng)求過來時(shí),我們使用 sadd 將用戶 ID 塞進(jìn)去就可 以了捉邢。通過 scard 可以取出這個(gè)集合的大小脯丝,這個(gè)數(shù)字就是這個(gè)頁面的 UV 數(shù)據(jù)。不錯(cuò)伏伐,這也是一個(gè)實(shí)現(xiàn)方案宠进,但這個(gè)方案也有缺點(diǎn),那就是數(shù)據(jù)量比較大時(shí)藐翎,如果你的頁面訪問量非常大材蹬,比如一個(gè)爆款頁面幾千萬的 UV,你需要一個(gè)很大 的 set 集合來統(tǒng)計(jì)吝镣,這就非常浪費(fèi)空間堤器。

鋪墊了那么久,其實(shí)就是為了引出這個(gè)解決方案的主角末贾,那就是HyperLogLog闸溃,Redis 提供了 HyperLogLog 數(shù)據(jù)結(jié)構(gòu)就是用來解決 這種統(tǒng)計(jì)問題的。HyperLogLog 提供不精確的去重計(jì)數(shù)方案,雖然不精確但是也不是非常不精確辉川,標(biāo)準(zhǔn)誤差是不到1%表蝙,這樣的精確度已經(jīng)可以滿足上面的 UV 統(tǒng)計(jì)需求了。
操作:增加(pfadd)和統(tǒng)計(jì)(pfcount):


圖片.png

大家看了會(huì)說乓旗,這部挺準(zhǔn)確的府蛇,添加了3個(gè),統(tǒng)計(jì)出來的就是3個(gè)屿愚,量大了就不行了

HyperLogLog 主要的應(yīng)用場景就是進(jìn)行基數(shù)統(tǒng)計(jì)汇跨。這個(gè)問題的應(yīng)用場景其實(shí)是十分廣泛的。例如:對(duì)于 Google 主頁面而言妆距,同一個(gè)賬戶可能會(huì)訪問 Google 主頁面多次扰法。于是,在諸多的訪問流水中毅厚,如何計(jì)算出 Google 主頁面每天被多少個(gè)不同的賬戶訪問過就是一個(gè)重要的問題。那么對(duì)于 Google 這種訪問量巨大的網(wǎng)頁而言浦箱,其實(shí)統(tǒng)計(jì)出有十億 的訪問量或者十億零十萬的訪問量其實(shí)是沒有太多的區(qū)別的吸耿,因此,在這種業(yè)務(wù)場景下酷窥,為了節(jié)省成本咽安,其實(shí)可以只計(jì)算出一個(gè)大概的值,而沒有必要計(jì)算出精準(zhǔn)的值蓬推。

對(duì)于上面的場景妆棒,可以使用HashMapBitMapHyperLogLog 來解決沸伏。對(duì)于這三種解決方案糕珊,這邊做下對(duì)比:

  • HashMap:算法簡單,統(tǒng)計(jì)精度高毅糟,對(duì)于少量數(shù)據(jù)建議使用红选,但是對(duì)于大量的數(shù)據(jù)會(huì)占用很大內(nèi)存空間;
  • BitMap:位圖算法姆另,統(tǒng)計(jì)精度高喇肋,雖然內(nèi)存占用要比HashMap少,但是對(duì)于大量數(shù)據(jù)還是會(huì)占用較大內(nèi)存迹辐;
  • HyperLogLog :存在一定誤差蝶防,占用內(nèi)存少,穩(wěn)定占用 12k 左右內(nèi)存明吩,可以統(tǒng)計(jì) 2^64 個(gè)元素间学,對(duì)于上面舉例的應(yīng)用場景,建議使用。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菱鸥,一起剝皮案震驚了整個(gè)濱河市宗兼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氮采,老刑警劉巖殷绍,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹊漠,居然都是意外死亡主到,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門躯概,熙熙樓的掌柜王于貴愁眉苦臉地迎上來登钥,“玉大人,你說我怎么就攤上這事娶靡∧晾危” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵姿锭,是天一觀的道長塔鳍。 經(jīng)常有香客問我,道長呻此,這世上最難降的妖魔是什么轮纫? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮焚鲜,結(jié)果婚禮上掌唾,老公的妹妹穿的比我還像新娘。我一直安慰自己忿磅,他們只是感情好糯彬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贝乎,像睡著了一般情连。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上览效,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天却舀,我揣著相機(jī)與錄音,去河邊找鬼锤灿。 笑死挽拔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的但校。 我是一名探鬼主播螃诅,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了术裸?” 一聲冷哼從身側(cè)響起倘是,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袭艺,沒想到半個(gè)月后搀崭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猾编,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年瘤睹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片答倡。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轰传,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘪撇,到底是詐尸還是另有隱情获茬,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布倔既,位于F島的核電站锦茁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叉存。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一度帮、第九天 我趴在偏房一處隱蔽的房頂上張望歼捏。 院中可真熱鬧,春花似錦笨篷、人聲如沸瞳秽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽练俐。三九已至,卻和暖如春冕臭,著一層夾襖步出監(jiān)牢的瞬間腺晾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工辜贵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悯蝉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓托慨,卻偏偏與公主長得像鼻由,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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