如何理解Redis中的二進位制陣列(bitmap)

語言: CN / TW / HK
  • 前言

  • 1. bitmap

  • 1.1. bitmap是什麼?

  • 2.redis相關命令

  • 2.1. SETBIT

  • 2.2 GETBIT

  • 2.3 BITCOUNT

  • 2.4 BITOP

前言

1. bitmap

1.1. bitmap是什麼

redis中的bitmap跟實際所理解的bitmap是相同的都是一種按位運算的一種結構,這種結構圖如下:

image.png

所以在bitmap中儲存的就是0或者1,用來標識是或者否,以使用者登入為例,要統計微信內有多少使用者登入,那麼如果使用者登入就設定對應位中的資料為1,並且是按照自增進行設定,要統計有多少使用者登入時就可以將bitmap中所有的資料進行計算得到所有登入的使用者(如果刷過劍指offer可以知道這樣的計算就是統計一個二進位制中所有1的個數)。

而redis中也是通過這樣的結構來實現對應的需求。並且redis還提供了SETBIT、GETBIT、BITCOUNT、BITOP四個命令用於處理bitmap陣列。

2. redis相關命令

2.1. SETBIT

SETBIT用於為陣列指定偏移量上的二進位制位設定值,位陣列的偏移量從0開始計數,而二進位制的值則可以是0或者1

命令使用如下:

image.png

我設定名為bit的陣列偏移量為0的二進位制值為1,因此可以將bit理解為0001;

image.png

設定bit陣列偏移量為3的二進位制位1,那麼可以將bit理解為1001;

2.2. GETBIT

GETBIT用於獲取位陣列指定偏移量上的二進位制位的值:命令在上圖中已展示。

2.3. BITCOUNT

BITCOUNT命令用於統計位數組裡面值為1的二進位制的數量

image.png

如上圖中通過命令獲取了bit陣列中1的值,我們知道在對位進行計算時效能是很高的,所以直接通過位運算得到1的個數在效能上有很大的提升,這裡具體如何計算的可以參考劍指offer15題:leetcode-cn.com/problems/er…

2.4. BITOP

BITOP命令可以對多個位數組按位與(and)、按位或(or)、按位異或(xor)運算:

image.png

上圖中設定bit陣列的資料結果為:1001

bit2陣列的資料結構為:1101

通過bitop對bit和bit2做and運算後得到1001;做or運算後1101

bitop操作可以實際應用在如下場景:

如統計連續三天登入的使用者數量,這時可以每天設定一個位數組,

例如20201208是一個位數組,20201209是一個位數組,20201210是一個位數組。

填充資料如下,那麼我要統計連續三天登入的使用者,那麼對三個位陣列進行操作,得到最終的資料然後統計1的個數即可得到連續三天登入使用者的數量,下圖中會統計出兩個使用者。

image.png

以上就是redis中關於如何使用bitmap記錄,要將bitmap聯絡到實際場景更容易理解其中的實現方式以及原理。

關於GETBIT、SETBIT、BITCOUNT、BITOP的實現原理下一章節繼續研究!

參考資料:

  1. 《redis的設計與實現》