基礎(chǔ)概念
“a”ASCll碼是97蹋艺,二進(jìn)制是0110 0001,每個數(shù)“1”善绎,“0”叫做位(bit)黔漂,每8位叫做一個字節(jié)(byte),偏移量從左到右,從1到(二進(jìn)制總數(shù)-1)
Bitmap是一串連續(xù)的二進(jìn)制數(shù)字(0或1),每一位所在的位置為偏移(offset)枕磁,在bitmap上可執(zhí)行AND,OR,XOR以及其它位操作,實(shí)現(xiàn)大數(shù)據(jù)統(tǒng)計(jì)日活躍用戶、避免重復(fù)點(diǎn)贊等
優(yōu)點(diǎn)
- 效率極高噩峦,setbit和getbit的時間復(fù)雜度就是O(1)笑窜,其他位運(yùn)算也是效率極高的
- 極省空間程储,官網(wǎng)公式($offset/8/1024/1024)MB鳍置,假設(shè)有2億用戶辽剧,需要花200000000/8/1024/1024 = 24M即可
缺點(diǎn)
- 位計(jì)算和位表示數(shù)值的局限
舉例文章重復(fù)點(diǎn)贊
SETBIT key offset value
對 key 所儲存的字符串值,設(shè)置或清除指定偏移量上的位(bit)税产,位的設(shè)置或清除取決于 value 參數(shù)怕轿,可以是 0 也可以是 1,當(dāng) key 不存在時砖第,自動生成一個新的字符串值;offset 參數(shù)必須大于或等于 0 环凿,小于 2^32 (bit 映射被限制在 512 MB 之內(nèi))梧兼,時間復(fù)雜度O(1),返回原偏移量的位
BITCOUNT key [start] [end]
計(jì)算給定字符串中智听,被設(shè)置為 1 的比特位的數(shù)量羽杰,指定額外的 start 或 end 參數(shù),可以讓計(jì)數(shù)只在特定的位上進(jìn)行到推,可以使用負(fù)數(shù)值:比如 -1 表示最后一個位考赛,而 -2 表示倒數(shù)第二個位,以此類推莉测,時間復(fù)雜度O(N)颜骤,返回被設(shè)置為 1 的位的數(shù)量
可用于大數(shù)據(jù)簽到、重復(fù)點(diǎn)贊捣卤、訂單重復(fù)評論等
實(shí)現(xiàn)一:
# 假設(shè)某用戶id=1忍抽,文章id=1,相互拼接為11董朝,則偏移量11設(shè)置成1(前提用戶id和文章id是唯一的)
127.0.0.1:6379> setbit artcle 11 1
(integer) 0
# 統(tǒng)計(jì)全部點(diǎn)贊人數(shù)
127.0.0.1:6379> bitcount artcle
(integer) 1
# 模擬重復(fù)點(diǎn)贊同一篇文章鸠项,返回了1,就可以根據(jù)返回值避免重復(fù)點(diǎn)贊
127.0.0.1:6379> setbit artcle 11 1
(integer) 1
實(shí)現(xiàn)二:
# 假設(shè)某用戶id=10子姜,有篇文章叫artcleA祟绊,則設(shè)置artcleA上的位10成1
127.0.0.1:6379> setbit artcleA 10 1
(integer) 0
# 統(tǒng)計(jì)文章artcleA的點(diǎn)贊人數(shù)
127.0.0.1:6379> bitcount artcle
(integer) 1
# 模擬重復(fù)點(diǎn)贊同一篇文章,返回了1哥捕,就可以根據(jù)返回值避免重復(fù)點(diǎn)贊
127.0.0.1:6379> setbit artcleA 10 1
(integer) 1
總結(jié):
倆種方法牧抽,角度不同實(shí)現(xiàn)不同,都可以實(shí)現(xiàn)目標(biāo)遥赚,第一種方法阎姥,優(yōu)點(diǎn)存儲內(nèi)存低,缺點(diǎn)擴(kuò)展性低鸽捻,不能查看某篇文章點(diǎn)贊數(shù)呼巴,第二種方法泽腮,擴(kuò)展性高,可以通過BITOP方法操作多個key衣赶,實(shí)現(xiàn)一些統(tǒng)計(jì)功能诊赊,缺點(diǎn)比第一種花費(fèi)更多存儲空間