用redis的bitmap方式統(tǒng)計(jì)上億訪問(wèn)量的周活躍用戶(hù)

提出問(wèn)題

網(wǎng)站每天有1億的訪問(wèn)量,產(chǎn)品提出要統(tǒng)計(jì)每個(gè)uid的周活躍,目前是日志分析解決的,每天有20G的日志,公司有dip平臺(tái)會(huì)用日志去計(jì)算,每次要計(jì)算兩小時(shí)才能處理完。

分析問(wèn)題

考慮了一下是否可以用redis的bitmap的方式來(lái)做一個(gè)統(tǒng)計(jì)周活躍的功能

先簡(jiǎn)單說(shuō)下bitmap的原理:
假設(shè)有3個(gè)同學(xué):

小明 1 小明 2 小明 3

如果有三間房,0是男,女是1,

房1 房2 房2
0 1 1

如果要統(tǒng)計(jì)現(xiàn)在班上有幾位女生,就可以看到兩個(gè)1就是兩位女生

在計(jì)算機(jī)里,一個(gè)字節(jié)里有8個(gè)二進(jìn)制位,即1byte=8bit
假設(shè)有7個(gè)數(shù)字,我們可以按照編號(hào)放進(jìn)一段連續(xù)內(nèi)存里,對(duì)應(yīng)位置中存在就顯示1,其它默認(rèn)都顯示0
比如 3,5,1,7,11,15,4,1
那對(duì)應(yīng)的位置為:

byte0  0 1 0 1 0 1 0 1
byte1  0 0 0 1 0 0 0 1

很明顯我們已經(jīng)方便的對(duì)這些數(shù)字做了排序了,甚至還做了排重
如果我們要找7是否存在這個(gè)數(shù)組中,

只需要7/8 對(duì)應(yīng)到第一個(gè)字節(jié)byte0中
7%8對(duì)應(yīng)到第7位上,如果是1就存在,0就不存在。

如果兩億的數(shù)字做排序排重,我們大概要占用好幾G的空間,如果用bitmap方式,最少只需要200000000/8/1024/1024 = 24M的空間就夠了

接下來(lái)我們看看bitmap在redis上的應(yīng)用:

假設(shè)這是我們uid的登錄情況
0代表未登錄,1代表登錄

Monday
8987129 0
8298191 1
8892198 1

Tuesday
8987129 0
8298191 0
8892198 1

Wednesday
8987129 0
8298191 1
8892198 1

Thursday
8987129 0
8298191 0
8892198 0

Friday
8987129 0
8298191 1
8892198 1

Saturday
8987129 0
8298191 1
8892198 0

Sunday
8987129 1
8298191 1
8892198 0

用setbit方法,將這些數(shù)據(jù)錄入到redis中:

setbit key offset value
設(shè)置offset對(duì)應(yīng)二進(jìn)制上的值,返回該位上的舊值

注意:如果offset過(guò)大,則會(huì)在中間填充0
   offset最大到2^32-1,即可推出最大的字符串為512M
127.0.0.1:6379> setbit Monday 8987129 0
(integer) 0
127.0.0.1:6379> setbit Monday 8298191 1
(integer) 0
127.0.0.1:6379> setbit Monday 8892198 1
(integer) 0
127.0.0.1:6379> setbit Tuesday 8987129 0
(integer) 0
127.0.0.1:6379> setbit Tuesday 8298191 0
(integer) 0
127.0.0.1:6379> setbit Tuesday 8892198 1
(integer) 0
127.0.0.1:6379> setbit Wednesday 8987129 0
(integer) 0
127.0.0.1:6379> setbit Wednesday 8298191 1
(integer) 0
127.0.0.1:6379> setbit Wednesday 8892198 1
(integer) 0
127.0.0.1:6379> setbit Thursday 8987129 0
(integer) 0
127.0.0.1:6379> setbit Thursday 8298191 0
(integer) 0
127.0.0.1:6379> setbit Thursday 8892198 0
(integer) 0
127.0.0.1:6379> setbit Friday 8987129 0
(integer) 0
127.0.0.1:6379> setbit Friday 8298191 1
(integer) 0
127.0.0.1:6379> setbit Friday 8892198 1
(integer) 0
127.0.0.1:6379> setbit Saturday 8987129 0
(integer) 0
127.0.0.1:6379> setbit Saturday 8298191 1
(integer) 0
127.0.0.1:6379> setbit Saturday 8892198 0
(integer) 0
127.0.0.1:6379> setbit Sunday 8987129 0
(integer) 0
127.0.0.1:6379> setbit Sunday 8298191 1
(integer) 0
127.0.0.1:6379> setbit Sunday 8892198 0
(integer) 0

接下來(lái)要計(jì)算7天內(nèi)有登錄行為的用戶(hù),只需要將周一到周五的值做位或運(yùn)算就可以了

補(bǔ)充下位與運(yùn)算符:

按位與運(yùn)算符(&)
參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行“與”運(yùn)算。
運(yùn)算規(guī)則:0&0=0;  0&1=0;   1&0=0;    1&1=1;
    即:兩位同時(shí)為“1”,結(jié)果才為“1”,否則為0
      
按位或運(yùn)算符(|)
參加運(yùn)算的兩個(gè)對(duì)象,按二進(jìn)制位進(jìn)行“或”運(yùn)算。
運(yùn)算規(guī)則:0|0=0;  0|1=1;  1|0=1;   1|1=1;
    即 :參加運(yùn)算的兩個(gè)對(duì)象只要有一個(gè)為1,其值為1。
     
異或運(yùn)算符(^)
參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行“異或”運(yùn)算。
運(yùn)算規(guī)則:0^0=0;  0^1=1;  1^0=1;   1^1=0;
即:參加運(yùn)算的兩個(gè)對(duì)象,如果兩個(gè)相應(yīng)位為“異”(值不同),則該位結(jié)果為1,否則為0。

最后計(jì)算7天內(nèi)登錄過(guò)的活躍用戶(hù):

    127.0.0.1:6379> bitop OR result Monday Tuesday Wednesday Thursday Friday Saturday Sunday
bitop operation rs key1 [key2..]    
對(duì)key1 key2做opecation并將結(jié)果保存在rs上
opecation可以是AND(與) OR(或) NOT(非) XOR(異或)

8298191 1|0|1|0|1|1|1 = 1
8892198 1|1|1|0|1|0|0 = 1
8987129 0|0|0|0|0|0|0 = 0

這里計(jì)算的結(jié)果假設(shè)3個(gè)uid都是連續(xù)的話就是 110,其實(shí)真實(shí)的存儲(chǔ)位置是
...1.....1....0......
也就是本周有兩個(gè)活躍用戶(hù)登錄過(guò)。

就這樣,一個(gè)上億訪問(wèn)量的日志統(tǒng)計(jì),在redis的bitmap方式輕松解決。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評(píng)論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評(píng)論 3 428
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,904評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,633評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,368評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,736評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,919評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,235評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,427評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,656評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,055評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,348評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,160評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,380評(píng)論 2 379