大數(shù)據(jù)面試題:redis部分 bit 操作?

(1)基本用法
位圖不是真正的數(shù)據(jù)類型,它是定義在字符串類型中,一個(gè)字符串類型的值最多能存儲(chǔ)512M 字節(jié)的內(nèi)容,位上限:2^(9+10+10+3)=2^32b
(2)命令
設(shè)置某一位上的值
SETBIT key offset value 0/1 偏移量從 0 開始
獲取某一位上的值
GETBIT key offset
返回指定值 0 或者 1 在指定區(qū)間上第一次出現(xiàn)的位置偏移量
BITPOS key bit [start 字節(jié)] [end 字節(jié)]
bitpos k1 1 1 1
k2: 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
k3: 0 1 0 0 0 0 1 0
0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0
setbit k1 1 1
(3)位操作
0 1 0 0 0 0 0 1
1 1 1 0 0 0 0 1
0 1 0 0 0 0 0 1
對(duì)一個(gè)或多個(gè)保存二進(jìn)制位的字符串 key 進(jìn)行位元操作,并將結(jié)果保存到 destkey operation 可以是 AND 、 OR 、 NOT 、 XOR 這四種操作中的任意一種
BITOP AND destkey key [key ...] ,對(duì)一個(gè)或多個(gè) key 求邏輯并,并將結(jié)果保存到destkey
BITOP OR destkey key [key ...] ,對(duì)一個(gè)或多個(gè) key 求邏輯或,并將結(jié)果保存到 destkey
BITOP XOR destkey key [key ...] ,對(duì)一個(gè)或多個(gè) key 求邏輯異或,并將結(jié)果保存到destkey
BITOP NOT destkey key ,對(duì)給定 key 求邏輯非,并將結(jié)果保存到 destkey
除了 NOT 操作之外,其他操作都可以接受一個(gè)或多個(gè) key 作為輸入
當(dāng) BITOP 處理不同長(zhǎng)度的字符串時(shí),較短的那個(gè)字符串所缺少的部分會(huì)被看作 0空的 key 也被看作是包含 0 的字符串序列
(4)應(yīng)用場(chǎng)景
網(wǎng)站用戶的上線次數(shù)統(tǒng)計(jì)(活躍用戶)
用戶 ID 為 key,天作為 offset,上線置為 1 366> 000000000000000
366 /8 50Byte 16 50
key: mike value: 11 1 000000000000000001010000000000000000
ID 為 500 的用戶,今年的第 1 天上線、第 30 天上線
SETBIT u500 1 1 1 0 0 000 0 …….1 0 00 0 > 365 /8 46 Byte
SETBIT u500 30 1
BITCOUNT mike 0 -1
按天統(tǒng)計(jì)網(wǎng)站活躍用戶
天作為 key,用戶 ID 為 offset,上線置為 1
求一段時(shí)間內(nèi)活躍用戶數(shù) 500 / 8 366 * 63Byte
SETBIT 20180601 15 1 1 1 0 1 00 00 00 0 00 00 0
SETBIT 20180603 123 1 0 1 0 0 00 00 01 0 00 00 0
SETBIT 20180606 123 1 0 1 0 0 00 00 01 0 00 00 0
求 6 月 1 日到 6 月 10 日的活躍用戶
BITOP OR aaa 20160601 20160602 20160603 20160610
BITCOUNT aaa 0 -1