Redis BitMap适应场景
https://blog.csdn.net/paul_wei2008/article/details/53366588
Bitmap以及Redis Bitmaps快速入門(Crash Course on Bitmap and Redis Bitmaps)
Bitmap(即Bitset)
? ? Bitmap是一串連續(xù)的2進(jìn)制數(shù)字(0或1),每一位所在的位置為偏移(offset),在bitmap上可執(zhí)行AND,OR,XOR以及其它位操作。
位圖計(jì)數(shù)(Population Count)
? ? 位圖計(jì)數(shù)統(tǒng)計(jì)的是bitmap中值為1的位的個(gè)數(shù)。位圖計(jì)數(shù)的效率很高,例如,一個(gè)bitmap包含10億個(gè)位,90%的位都置為1,在一臺(tái)MacBook Pro上對(duì)其做位圖計(jì)數(shù)需要21.1ms。SSE4甚至有對(duì)整形(integer)做位圖計(jì)數(shù)的硬件指令。
Redis Bitmaps
? ? Redis允許使用二進(jìn)制數(shù)據(jù)的Key(binary keys) 和二進(jìn)制數(shù)據(jù)的Value(binary values)。Bitmap就是二進(jìn)制數(shù)據(jù)的value。Redis的 setbit(key, offset, value)操作對(duì)指定的key的value的指定偏移(offset)的位置1或0,時(shí)間復(fù)雜度是O(1)。
?
一個(gè)簡(jiǎn)單的例子:日活躍用戶
? ? 為了統(tǒng)計(jì)今日登錄的用戶數(shù),我們建立了一個(gè)bitmap,每一位標(biāo)識(shí)一個(gè)用戶ID。當(dāng)某個(gè)用戶訪問我們的網(wǎng)頁(yè)或執(zhí)行了某個(gè)操作,就在bitmap中把標(biāo)識(shí)此用戶的位置為1。在Redis中獲取此bitmap的key值是通過用戶執(zhí)行操作的類型和時(shí)間戳獲得的。
這個(gè)簡(jiǎn)單的例子中,每次用戶登錄時(shí)會(huì)執(zhí)行一次redis.setbit(daily_active_users, user_id, 1)。將bitmap中對(duì)應(yīng)位置的位置為1,時(shí)間復(fù)雜度是O(1)。統(tǒng)計(jì)bitmap結(jié)果顯示有今天有9個(gè)用戶登錄。Bitmap的key是daily_active_users,它的值是1011110100100101。
? ? 因?yàn)槿栈钴S用戶每天都變化,所以需要每天創(chuàng)建一個(gè)新的bitmap。我們簡(jiǎn)單地把日期添加到key后面,實(shí)現(xiàn)了這個(gè)功能。例如,要統(tǒng)計(jì)某一天有多少個(gè)用戶至少聽了一個(gè)音樂app中的一首歌曲,可以把這個(gè)bitmap的redis key設(shè)計(jì)為play:yyyy-mm-dd-hh。當(dāng)用戶聽了一首歌曲,我們只是簡(jiǎn)單地在bitmap中把標(biāo)識(shí)這個(gè)用戶的位置為1,時(shí)間復(fù)雜度是O(1)。
[java]?
?
-
Redis.setbit(play:yyyy-mm-dd, user_id, 1)??
Redis.setbit(play:yyyy-mm-dd, user_id, 1)
? ? 今天聽過歌曲的用戶就是key是play:yyyy-mm-dd的bitmap的位圖計(jì)數(shù)。如果要按周或月統(tǒng)計(jì),只要對(duì)這周或這個(gè)月的所有bitmap求并集,得出新的bitmap,在對(duì)它做位圖計(jì)數(shù)
?? 利用這些bitmap做其它復(fù)雜的統(tǒng)計(jì)也非常容易。例如,統(tǒng)計(jì)11月聽過歌曲的高級(jí)用戶(premium user):
(play:2011-11-01∪ play:2011-11-02∪ … ∪ play:2011-11-30)∩premium:2011-11
?
1億2千8百萬(wàn)用戶的性能比較(Performance comparison using 128 million users)
? ? 下面的表格顯示了在1億2千8百萬(wàn)用戶上完成的時(shí)間粒度為1天,一周,一個(gè)月的用戶統(tǒng)計(jì)的時(shí)間消耗比較。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/9314662.html
總結(jié)
以上是生活随笔為你收集整理的Redis BitMap适应场景的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解如何使用Istio监控基于容器的服务
- 下一篇: Redis 基数统计:HyperLogL