《redis 統(tǒng)計日活》要點(diǎn):
本文介紹了redis 統(tǒng)計日活,希望對您有用。如果有疑問,可以聯(lián)系我們。
最近有個需求是需要統(tǒng)計某個版本的安裝數(shù)量,之前接觸過類似的需求,使用 redis 的bitmap 來記錄,比如user_id是11位的,比如我們統(tǒng)計一下:
setbit today 4294967295 1
setbit today 1 1
redis-cli --bigkeys
統(tǒng)計顯示:Biggest string found 'today' has 536870912 bytes,4G
因為 bit offset 最大是2^32,即 4294967295, 10位,我們的一般ID都是11位,那怎么統(tǒng)計?
我的做法是 offset%1000 放到key后綴,進(jìn)行統(tǒng)計是否統(tǒng)計過,單獨(dú)計數(shù)來統(tǒng)計數(shù)量:
prefix = offset % 100
offset = offset / 100
setbit today: prefix offset 1
incr today:cnt 1
這樣,最大是數(shù)能統(tǒng)計到400(12位)億,資源占用就是 4G*100,就是100G
如果要區(qū)分終端,區(qū)分版本統(tǒng)計日活,那豈不是 100G * xxx 倍?
這個占用量也很大啊?又沒有更好的方法呢?
辦理:
從這邊文章:http://highscalability.com/blog/2012/4/5/big-data-counting-how-to-count-a-billion-distinct-objects-us.html
Sparse bitmaps can be compressed in order to gain space efficiency, but that is not always helpful.
找到答案,使用Hyper LogLog,可以滿足需求:
pfadd today 1
pfadd today 2
統(tǒng)計: pfcount today
占用空間只有:
12304 bytes, 12k
完美辦理啊,基于 hyper loglog是什么,可以看上面的文章詳細(xì)了解.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《redis 統(tǒng)計日活》等實戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/9250.html