一、理論基礎
1、數據在redis中都是二進制存儲;
2、每一個非中文字符佔一個字節(Byte),中文字符佔兩個字節,而一個字節又是佔8bit。
3、位圖不是一個真實的數據類型,而是定義在字符串類型上的面向位的操作的集合。
二、語法
GETBIT key offset
對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。
SETBIT key offset value
對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。
BITCOUNT key [start] [end]
統計給定key所存儲的字符串比特位爲1的數量。
三、演示
1、先設置一個<key,value>對
master:6379[4]> set A a
OK
master:6379[4]> get A
"a"
"a"在redis中的二進制存儲形式爲:0110 0001;
master:6379[4]> getbit A 0
(integer) 0
master:6379[4]> getbit A 1
(integer) 1
master:6379[4]> getbit A 2
(integer) 1
master:6379[4]> getbit A 3
(integer) 0
master:6379[4]> getbit A 4
(integer) 0
master:6379[4]> getbit A 5
(integer) 0
master:6379[4]> getbit A 6
(integer) 0
master:6379[4]> getbit A 7
(integer) 1
master:6379[4]>
2、將上述A的值"a"的偏移量第6位修改爲1,從而值從a變成了c(0110 0101)。
master:6379[4]> setbit A 6 1
(integer) 0
master:6379[4]> getbit A 6
(integer) 1
master:6379[4]> get A
"c"
master:6379[4]>
偏移量:實際上指的就是從左往右數,從0開始,偏移量是幾就是幾;
master:6379[4]> getbit A 0
(integer) 0
master:6379[4]> getbit A 1
(integer) 1
master:6379[4]> getbit A 2
(integer) 1
master:6379[4]> getbit A 3
(integer) 0
master:6379[4]> getbit A 4
(integer) 0
master:6379[4]> getbit A 5
(integer) 0
master:6379[4]> getbit A 6
(integer) 1
master:6379[4]> getbit A 7
(integer) 1
master:6379[4]>
3、統計位中出現1的次數[bitcount A]
master:6379[4]> get A
"c"
master:6379[4]> getbit A 0
(integer) 0
master:6379[4]> getbit A 1
(integer) 1
master:6379[4]> getbit A 2
(integer) 1
master:6379[4]> getbit A 3
(integer) 0
master:6379[4]> getbit A 4
(integer) 0
master:6379[4]> getbit A 5
(integer) 0
master:6379[4]> getbit A 6
(integer) 1
master:6379[4]> getbit A 7
(integer) 1
master:6379[4]> bitcount A
(integer) 4
master:6379[4]>
四、位圖的使用場景
1、實現用戶上線次數統計;
2、用戶在線狀態及人數統計記錄;
五、使用位圖的優點
位圖的最大優勢是有時是一種非常顯著的節省空間來存儲信息的方式。比如我們的id最大值是一億,我們只需要一億個位就行了,相當於只需要100000000/8/1024/1024=11.9M的內存;