1.SETBIT key offset value
對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。
在redis中,存儲的字符串都是以二級制的進行存在的。
舉例:
設置一個 key-value ,鍵的名字叫“andy” 值為字符'a'
我們知道 'a' 的ASCII碼是 97。轉換為二進制是:01100001。offset的學名叫做“偏移” 。二進制中的每一位就是offset值啦,比如在這里 offset 0 等於 ‘0’ ,offset 1等於'1' ,offset2等於'1',offset 6 等於'1' ,沒錯,offset是從左往右計數的,也就是從高位往低位。
我們通過SETBIT 命令將 andy中的 'a' 變成 'b' 應該怎么變呢?
也就是將 01100001 變成 01100010 (b的ASCII碼是98),這個很簡單啦,也就是將'a'中的offset 6從0變成1,將offset 7 從1變成0 。
果然,就從'a' 變成 'b'了。
這就是redis 中 “SETBIT” 的基本用法。
2. BITCOUNT 就是統計字符串的二級制碼中,有多少個'1'。
所以在這里,BITCOUNT andy 得到的結果就是 3 啦。
3.1 BITCOUNT key [start end]
從左向右從0開始,從右向左從-1開始,注意start和end是字節
BITCOUNT testkey 0 0 表示從索引0個字節到索引0個字節,就是第一個字節的統計
BITCOUNT testkey 0 -1 等同於BITCOUNT testkey
最常用的就是BITCOUNT testkey
3.2 實戰
3.3 實例解析
3. Getbit 命令用於對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。
4、BITOP
4.1對一個或多個保存二進制位的字符串key進行位元操作,並將結果保存到destkey上。
operation可以是AND、OR、NOT、XOR這四種操作中的任意一種。
BITOP AND destkey key [key ...] ,對一個或多個key求邏輯並,並將結果保存到destkey
BITOP OR destkey key [key ...] ,對一個或多個key求邏輯或,並將結果保存到destkey
BITOP XOR destkey key [key ...] ,對一個或多個key求邏輯異或,並將結果保存到destkey
BITOP NOT destkey key ,對給定key求邏輯非,並將結果保存到destkey
除了NOT操作外,其他操作都可以接受一個或多個key作為輸入
當BITOP處理不同長度的字符串時,較短的那個字符串所缺少的部分會被看做0
空的key也被看作是包含0的字符串序列
4.2 實戰
bitset的使用場景
假設這樣一個場景,假如每個網站有1億的用戶,那么我們怎么來統計這個網站的日登陸數或者說有哪些用戶登錄過這個網站。
最常見的做法就是設計一張用戶登錄表:
user_login:
user_uid login_date
0 2017-7-1
1 2017-7-1
0 2017-7-2
如果平均一個人一天登錄1次,那么1億個用戶一個星期就會產生1 * 1 * 7 = 7億條數據,一個月就會產生30億條數據,這對數據庫的壓力是很大的,只是統計一下用戶登錄,沒必要花費這么多的資源。
這個時候我們就可以用reids 的bitmap來解決。
用戶是否登錄可以用0/1來表示,0代表用戶不登陸,1表示登錄,那么1bit 就可以表示用戶是否登錄。
1億個用戶一天的數據量也就 1 0000 0000bit = 11.92m,也就是說用戶一天的登錄信息也就產生11.92m的數據量。一個月也就357.63m的數據量。
具體實現過程(為了實驗方便,我們就假設4個用戶0,1,2,3,統計兩天的登錄量):
mon: 1010 (用戶0未登錄,用戶1登錄,用戶2未登錄,用戶3登錄)
tue: 1101 (用戶0登錄,用戶1未登錄,用戶2登錄,用戶3登錄)
如果要統計這兩天都登陸的用戶:
可以看到mon 和 tue做and運算,得到結果result 為 :1000,則表示用戶3連續兩天都登陸,其他用戶兩天中只有一天登錄。