redis bitmap


https://www.cnblogs.com/devilwind/p/7374017.html

Redis Bitmaps
    Redis允許使用二進制數據的Key(binary keys) 和二進制數據的Value(binary values)。Bitmap就是二進制數據的value。Redis的 setbit(key, offset, value)操作對指定的key的value的指定偏移(offset)的位置1或0,時間復雜度是O(1)。



一個簡單的例子:日活躍用戶

    為了統計今日登錄的用戶數,我們建立了一個bitmap,每一位標識一個用戶ID。當某個用戶訪問我們的網頁或執行了某個操作,就在bitmap中把標識此用戶的位置為1。在Redis中獲取此bitmap的key值是通過用戶執行操作的類型和時間戳獲得的。

       這個簡單的例子中,每次用戶登錄時會執行一次redis.setbit(daily_active_users, user_id, 1)。將bitmap中對應位置的位置為1,時間復雜度是O(1)。統計bitmap結果顯示有今天有9個用戶登錄。Bitmap的key是daily_active_users,它的值是1011110100100101。

    因為日活躍用戶每天都變化,所以需要每天創建一個新的bitmap。我們簡單地把日期添加到key后面,實現了這個功能。例如,要統計某一天有多少個用戶至少聽了一個音樂app中的一首歌曲,可以把這個bitmap的redis key設計為play:yyyy-mm-dd-hh。當用戶聽了一首歌曲,我們只是簡單地在bitmap中把標識這個用戶的位置為1,時間復雜度是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的位圖計數。如果要按周或月統計,只要對這周或這個月的所有bitmap求並集,得出新的bitmap,在對它做位圖計數。




    利用這些bitmap做其它復雜的統計也非常容易。例如,統計11月聽過歌曲的高級用戶(premium user):
(play:2011-11-01∪ play:2011-11-02∪ … ∪ play:2011-11-30)∩premium:2011-11

 

redis中bit映射被限制在512MB之內,所以最大是0.5*2^30 * 8(每個字節8位)=2^32

缺點就是如果用戶稀疏,會浪費內存,對uid hash空間更小

(拼多多面試真題:如何用Redis統計獨立用戶訪問量https://blog.csdn.net/weixin_38405253/article/details/92285696),也使用這種方式

 

ip白名單算法(pdd活躍用戶)

布隆過濾器解決url黑(白)名單

加上本篇文章,3篇文章使用的技術本質都是:

以能夠保存到int最大值(hash)2^31-1或unsigned int 最大值2^32-1的bit數組,長度為2^31或2^32,以bit為value的數組

優點是大數據量下省空間,缺點是小數據量下耗空間

比如:

優點:上千萬個ip白名單,用hash保存存在大量hash沖突拖累性能

缺點:某個ip白名單10個ip,申請了一個4g長度 512m內存的byte數組

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM