Bitmap 是什麼
Bitmap
即點陣圖,就是透過一個 bit
位來表示某個元素對應的值或者狀態,其中的 key
就是對應元素本身。我們知道 8
個 bit
可以組成一個 Byte
,所以 bitmap
本身會極大的節省儲存空間。
Redis從 2.2.0
版本開始新增了 setbit
,getbit
,bitcount
等幾個 bitmap
相關命令。雖然是新命令,但是並沒有新增新的資料型別,因為 setbit
等命令只不過是在 set
上的擴充套件。
Bitmap 的優勢和限制
優勢
- 基於最小的單位bit進行儲存,所以非常省空間。
- 設定時候時間複雜度O(1)、讀取時候時間複雜度O(n),操作是非常快的。
- 二進位制資料的儲存,進行相關計算的時候非常快。
- 方便擴容
限制
- redis中bit對映被限制在512MB之內,所以最大是2^32位。建議每個key的位數都控制下,因為讀取時候時間複雜度O(n),越大的串讀的時間花銷越多。
setbit 命令介紹
指令 SETBIT key offset value
設定或者清空 key
的 value
key
使用者自定義的 key
offset
偏移量value
bit值,只能為 0
或 1
原理介紹
set test a
這個很好理解,把 key
是 test
的值設定為 a
其中 a
的 Ascii
值是 97
,97
的二進位制是 1100001
[ PHP程式碼: echo decbin(ord(‘a’)); ]
譬如 b
的 ascii
值是 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的數量
這裡的 start
和 end
指的是位元組(不是位)
以上內容為整合各部落格文章而來
redis 命令 setbit、bitcount、getbit、bitop
第十章:Redis中bitmap的妙用
一看就懂系列之 詳解redis的bitmap在億級專案中的應用
【redis快取】Bitmap型別實現使用者簽到
本作品採用《CC 協議》,轉載必須註明作者和本文連結