目錄
基本介紹
基本命令?
Setbit?
Getbit?
BITCOUNT?
應(yīng)用場景
統(tǒng)計(jì)當(dāng)日活躍用戶
用戶簽到
bitmap - Redis布隆過濾器 (應(yīng)對緩存穿透問題)
基本介紹
Redis 的位圖(bitmap)是由多個(gè)二進(jìn)制位組成的數(shù)組,只有兩種狀態(tài),0和1, 數(shù)組中的每個(gè)二進(jìn)制位都有與之對應(yīng)的偏移量(從 0 開始),通過這些偏移量可以對位圖中指定的一個(gè)或多個(gè)二進(jìn)制位進(jìn)行操作。
可以把 Bitmap 想象成一個(gè)以位為單位的數(shù)組,數(shù)組的每個(gè)單元只能存儲 0 和 1,數(shù)組的下標(biāo)在 Bitmap 中叫做偏移量 offset,bitmap默認(rèn)值都為0.
?BitMap底層實(shí)際上使用字符串來存儲,由于 Redis 中字符串的最大長度是 512 MB字節(jié),所以 BitMap 的偏移量 offset 值也是有上限的,其最大值是:8 * 1024 * 1024 * 512 = 2^32(4G)。
BitMap 的基本原理就是用一個(gè) bit 來標(biāo)記某個(gè)元素對應(yīng)的 Value,而 Key 即是該元素。由于采用一 個(gè)bit 來存儲一個(gè)數(shù)據(jù),因此可以大大的節(jié)省空間。
計(jì)算機(jī)分配給內(nèi)存的最小單元是bit,1Byte=8bit, 1個(gè)整數(shù)類型為4Byte=32bit。
基本命令?
常用命令 | 作用 |
---|---|
1、getbit key offset | 用于獲取Redis中指定key對應(yīng)的值,中對應(yīng)offset的bit |
2、setbit key key offset value | 用于修改指定key對應(yīng)的值,中對應(yīng)offset的bit |
3、 bitcount key [start end] | 用于統(tǒng)計(jì)字符串被設(shè)置為1的bit數(shù) |
4、bitop and/or/xor/not destkey key [key …] | 用于對多個(gè)key求邏輯與/邏輯或/邏輯異或/邏輯非 |
Setbit?
Redis Setbit 命令用于對 key 所儲存的字符串值,設(shè)置或清除指定偏移量上的位(bit)。
redis> SETBIT bit 10086 1
(integer) 0
redis> GETBIT bit 10086
(integer) 1
redis> GETBIT bit 100 # bit 默認(rèn)被初始化為 0
(integer) 0
返回值:指定偏移量原來儲存的位。
Getbit?
Redis Getbit 命令用于對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。
# 對不存在的 key 或者不存在的 offset 進(jìn)行 GETBIT, 返回 0
redis> EXISTS bit
(integer) 0
redis> GETBIT bit 10086
(integer) 0
# 對已存在的 offset 進(jìn)行 GETBIT
redis> SETBIT bit 10086 1
(integer) 0
redis> GETBIT bit
返回值:字符串值指定偏移量上的位(bit)。當(dāng)偏移量 OFFSET 比字符串值的長度大,或者 key 不存在時(shí),返回 0 。
BITCOUNT?
統(tǒng)計(jì)指定位區(qū)間上,值為 1 的個(gè)數(shù)。語法格式如下:
BITCOUNT
key
[start
end
]
127.0.0.1:6379> BITCOUNT user:1
(integer) 8
只需指定 start 和 end 參數(shù),即可僅對特定字節(jié)進(jìn)行計(jì)數(shù)。start 和 end 參數(shù)和 GETRANGE 命令的參數(shù)類似,都可以使用負(fù)數(shù),比如 -1 表示倒數(shù)第一個(gè)位, -2 表示倒數(shù)第二個(gè)位。.?
應(yīng)用場景
統(tǒng)計(jì)當(dāng)日活躍用戶
每日活躍統(tǒng)計(jì)創(chuàng)建一個(gè)bitmap鍵,當(dāng)用戶活躍了根據(jù)用戶id的偏移量來設(shè)置對應(yīng)的位為1
用戶簽到
每個(gè)用戶創(chuàng)建一個(gè)位圖的鍵,以某一天為基礎(chǔ),之后的天數(shù)距離這一天的天數(shù)為偏移量,如果用戶點(diǎn)擊了簽到,則設(shè)置對用的偏移位為1。
bitmap - Redis布隆過濾器 (應(yīng)對緩存穿透問題)
舉例:比如爬蟲服務(wù)器在爬取電商網(wǎng)站的商品信息時(shí),首先經(jīng)過緩存,如果緩存查不到,再去數(shù)據(jù)庫獲取信息,因?yàn)榕老x的效率很高,且sku很有可能是不存在或者已下架的,就會造成緩存穿透,大量請求被發(fā)送到數(shù)據(jù)庫,導(dǎo)致服務(wù)器受到影響。文章來源:http://www.zghlxwxcb.cn/news/detail-677463.html
此時(shí),可以在緩存層之前,添加一個(gè)布隆過濾器,布隆 過濾器看作是一個(gè)bitmap,sku作為offset值,如果商品真實(shí)存在,bit值設(shè)為1。首先將商品數(shù)據(jù)初始化,當(dāng)有請求時(shí),通過getbit判斷sku是否有效。如果布隆過濾器認(rèn)為商品不存在,就拒絕訪問,這樣就可以保護(hù)存儲層。文章來源地址http://www.zghlxwxcb.cn/news/detail-677463.html
到了這里,關(guān)于Redis之bitmap類型解讀的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!