Bitmap為什麼那麼快?

2021-10-11 14:10:10 字數 1910 閱讀 4777

目錄

一、bitmap是個啥?

二、bitmap有什麼優缺?

三、bitmap有啥應用場景?

bitmap實際上就是string型別的,你可以在redis裡面help一下可以看到string是有類似bitop、bitpos等位操作。

redis中的string型別最大支援512m,因此最多可以支援512*1024*1024*8=2^32bit(位元),具體的bitmap是用於操作每個bit的值(只有1和0),如果你曾經用過ibm大型機或者學過組合語言的話應該不會陌生。

既然知道bitmap是什麼啦,那怎麼建立或初始化呢?也很簡單。string的話我們用set,類似的bitmap我們用setbit。

語法:setbit key offset value(當然這個value只能是0或1)

範例:setbit mybitmap 10 1        (這裡意思是建立key為mybitmap的bitmap,然後把offset為10的那個bit置為1

優缺點吧,網上一搜一大堆,我這裡也重複一下(算是方便自己以後翻查)優點

1、因為是基於bit的操作,所以適合大資料量的快速查詢及去重;

2、至於說節省空間,畢竟是以bit的形式儲存狀態,那絕對是要比使用字元格式儲存在資料庫中要來得多;

缺點 1、如果資料是比較稀疏的,例如我們使用使用者id的雜湊值作為bitmap的偏移量且使用者數量不多的話,從資料致密度來說還是挺浪費空間;(但是好像有很多專門的壓縮演算法,如rle)

2、注意偏移量的資料碰撞問題,還是上面的例子,特別是要雜湊函式帶來的資料碰撞問題;

基於曾經學過c和數位電路,這裡著重展開一下為什麼計算速度快,關鍵還是在於移位運算和其本身演算法。

移位運算:

還記得大學時候學數位電路嗎?應該有講過,移位計算在計算機裡面是很高效的運算方法(幸好大學裡學的數位電路沒有完全給回老師,哈哈)。

舉個簡單例子:1<<2 , 這裡代表00000001向左位移兩位變成00000100等於4,實際效果等於四則運算1* 2^2=4,因此它們是等效的。這些移位指令中,左移一位相當於乘以2,右移一位相當於除以2。

與乘除法相比,移位操作是是單機器週期指令(即一次操作只需乙個cpu週期時間),乘除法則需要多個cpu週期時間,如果涉及浮點運算則更甚(當然不同cpu架構有著不同的指令集也會導致一定的差異)。

另外,也跟定址方式有關係。

在arm架構,這種移位操作(如asl/asr/lsl/lsr)是基於暫存器定址。這裡通俗的解釋一下,就好像乙個人要掏個手機出來,你說從口袋還是從揹包裡掏出來哪個更快?其中,暫存器就好像口袋,記憶體就好像揹包,這裡大家就知道為什麼了吧。

演算法複雜度:

。怎麼理解?就是說無論輸入資料增大多少倍,前兩種演算法執行所需要的時間都不變,後三種是跟資料量大小成線性正比例。我這裡展示一下getbit的原始碼並簡單介紹一下它的邏輯(有興趣的朋友可以直接在github上找)。

從原始碼可以看出,無論你輸入的offset增加多少倍,它還是得通過兩步(1、除以8計算位於第幾個byte;2、於操作計算位於該byte陣列上第幾個bit),因此的演算法計算說話的時間是不變的,因此是o(1)。

你理解一下bitmap是什麼?首先,它有一條key(我這裡稱它為某個主題),它的value就是bitmap,然後bitmap是通過每乙個bit位去儲存或反映在該主題下的該bit位所代表的元素的狀態.。基於這樣的理解,那我們日常還是有很多場景可以套用bitmap的,例如日月活統計、點讚統計等常規功能網上一搜一大堆,這裡不打算展開。我覺得主要有以下兩種分類。

Redis為什麼那麼快

前言redis是基於鍵值對的nosql資料庫,redis的value可以由string,hash,list,set,zset,bitmaps,hyperloglog等多種資料結構和演算法組成。redis還提供了鍵過期,發布訂閱,事務,lua指令碼,哨兵,cluster等功能。redis執行命令非常快...

redis為什麼那麼快

目錄 redis快的原因 為什麼不採用多程序或多執行緒處理?單執行緒處理的缺點?多路 i o 復用 redis完全基於記憶體,絕大部分請求是存粹的記憶體操作,執行效率高,每秒能夠達到10萬 s的查詢速度 資料結構簡單,對資料操作也簡單 採用多路i o復用,非阻塞io,採用多路 i o 復用技術可以讓...

為什麼kafka的速度那麼快?

我們都知道,kafka是依賴於檔案系統來儲存和緩衝訊息的。在其他訊息佇列rabbitmq中,使用的是記憶體作為預設的儲存介質,而磁碟作為備選介質,以此來實現高吞吐和低延遲的效果 redis則是完全依賴於記憶體實現的。那為什麼kafka採用這種持久化的形式還能提供如此有競爭力的效能呢?首先kafka在...