Redis 中 Bitmap 詳解

邢闖洋發表於2020-11-16

Bitmap 是什麼

Bitmap 即點陣圖,就是通過一個 bit 位來表示某個元素對應的值或者狀態,其中的 key 就是對應元素本身。我們知道 8bit 可以組成一個 Byte,所以 bitmap 本身會極大的節省儲存空間。

Redis 中 Bitmap 詳解

Redis從 2.2.0 版本開始新增了 setbit,getbit,bitcount等幾個 bitmap 相關命令。雖然是新命令,但是並沒有新增新的資料型別,因為 setbit 等命令只不過是在 set 上的擴充套件。

Bitmap 的優勢和限制

優勢

  1. 基於最小的單位bit進行儲存,所以非常省空間。
  2. 設定時候時間複雜度O(1)、讀取時候時間複雜度O(n),操作是非常快的。
  3. 二進位制資料的儲存,進行相關計算的時候非常快。
  4. 方便擴容

限制

  • redis中bit對映被限制在512MB之內,所以最大是2^32位。建議每個key的位數都控制下,因為讀取時候時間複雜度O(n),越大的串讀的時間花銷越多。

setbit 命令介紹

指令 SETBIT key offset value
設定或者清空 keyvalue
key 使用者自定義的 key
offset 偏移量
value bit值,只能為 01

原理介紹

set test a

這個很好理解,把 keytest 的值設定為 a
其中 aAscii值是 9797 的二進位制是 1100001 [ PHP程式碼: echo decbin(ord(‘a’)); ]
譬如 bascii 值是 98,轉成二進位制是 1100010

從左往右數(索引從 0 開始),第 6 位和第 7 位不一致。因此只要 a 的二進位制值的第 6 位改成 1,第 7 位改成 0 就變成了 b

setbit test 6 1
setbit test 7 0
get test

然後就可以看到變成了 b

bitmap 型別,它也是從 string 型別擴充套件出來的結構,所以它的命令也可以操作 string

getbit key offset 獲取某個偏移量的值

bitcount key [start end], 統計出bit值為1的數量
這裡的 startend 指的是位元組(不是位)

以上內容為整合各部落格文章而來

redis 命令 setbit、bitcount、getbit、bitop
第十章:Redis中bitmap的妙用
一看就懂系列之 詳解redis的bitmap在億級專案中的應用
【redis快取】Bitmap型別實現使用者簽到

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章