溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

bitmap的相關(guān)命令有哪些

發(fā)布時(shí)間:2021-12-30 09:30:39 來源:億速云 閱讀:137 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“bitmap的相關(guān)命令有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1.使用場景

用戶上線次數(shù)統(tǒng)計(jì)、統(tǒng)計(jì)活躍用戶,簽到,點(diǎn)贊等具有標(biāo)識(shí)性功能

2.原理

就是通過一個(gè)bit位來表示某個(gè)元素對應(yīng)的值或者狀態(tài),其中的key就是對應(yīng)元素本身,是bit不是byte,1byte=8bit,優(yōu)點(diǎn)凸顯,就是賊雞兒省空間

空間占用、以及第一次分配空間需要的時(shí)間

在一臺(tái)2010MacBook Pro上,offset為2^32-1(分配512MB)需要~300ms,offset為2^30-1(分配128MB)需要~80ms,offset為2^28-1(分配32MB)需要~30ms,offset為2^26-1(分配8MB)需要8ms。<來自官方文檔>

大概的空間占用計(jì)算公式是:($offset/8/1024/1024)MB)

說起來bitmap不能算為一種新數(shù)據(jù)類型,只是set的擴(kuò)展

3.命令

命令

作用

setbit

設(shè)置Bitmap的值

getbit

獲取Bitmap的值

bitcount

獲取指定范圍內(nèi)值為1的個(gè)數(shù)

destkey

對Bitmap做操作,可以是and(交集),or(并集),not(非集)或者xor(異或)

                                              BITOP

BITOP operation destkey key [key ...],

operation 可以是 AND 、 OR 、 NOT 、 XOR 這四種操作中的任意一種:

● BITOP AND destkey key [key ...] ,對一個(gè)或多個(gè) key 求邏輯并,并將結(jié)果保存到 destkey 。

● BITOP OR destkey key [key ...] ,對一個(gè)或多個(gè) key 求邏輯或,并將結(jié)果保存到 destkey 。

● BITOP XOR destkey key [key ...] ,對一個(gè)或多個(gè) key 求邏輯異或,并將結(jié)果保存到 destkey 。

● BITOP NOT destkey key ,對給定 key 求邏輯非,并將結(jié)果保存到 destkey 。

除了 NOT 操作之外,其他操作都可以接受一個(gè)或多個(gè) key 作為輸入

     BITPOS

BITPOS key bit [start][end]

返回字符串里面第一個(gè)被設(shè)置為 1 或者 0 的bit位。

   BITFIELD

BITFIELD key [GET type offset][SET type offset value][INCRBY type offset increment][OVERFLOW WRAP|SAT|FAIL]

溢出控制

用戶可以通過 OVERFLOW 命令以及以下展示的三個(gè)參數(shù), 指定 BITFIELD 命令在執(zhí)行自增或者自減操作時(shí), 碰上向上溢出(overflow)或者向下溢出(underflow)情況時(shí)的行為:

  • WRAP :使用回繞(wrap around)方法處理有符號(hào)整數(shù)和無符號(hào)整數(shù)的溢出情況。對于無符號(hào)整數(shù)來說, 回繞就像使用數(shù)值本身與能夠被儲(chǔ)存的最大無符號(hào)整數(shù)執(zhí)行取模計(jì)算, 這也是 C 語言的標(biāo)準(zhǔn)行為。對于有符號(hào)整數(shù)來說, 上溢將導(dǎo)致數(shù)字重新從最小的負(fù)數(shù)開始計(jì)算, 而下溢將導(dǎo)致數(shù)字重新從最大的正數(shù)開始計(jì)算。比如說, 如果我們對一個(gè)值為 127 的 i8 整數(shù)執(zhí)行加一操作, 那么將得到結(jié)果 -128 。

  • SAT :使用飽和計(jì)算(saturation arithmetic)方法處理溢出, 也即是說, 下溢計(jì)算的結(jié)果為最小的整數(shù)值, 而上溢計(jì)算的結(jié)果為最大的整數(shù)值。舉個(gè)例子, 如果我們對一個(gè)值為 120 的 i8 整數(shù)執(zhí)行加 10 計(jì)算, 那么命令的結(jié)果將為 i8 類型所能儲(chǔ)存的最大整數(shù)值 127 。與此相反, 如果一個(gè)針對 i8 值的計(jì)算造成了下溢, 那么這個(gè) i8 值將被設(shè)置為 -127 。

  • FAIL :在這一模式下, 命令將拒絕執(zhí)行那些會(huì)導(dǎo)致上溢或者下溢情況出現(xiàn)的計(jì)算, 并向用戶返回空值表示計(jì)算未被執(zhí)行。

需要注意的是, OVERFLOW 子命令只會(huì)對緊隨著它之后被執(zhí)行的 INCRBY 命令產(chǎn)生效果, 這一效果將一直持續(xù)到與它一同被執(zhí)行的下一個(gè) OVERFLOW 命令為止。在默認(rèn)情況下, INCRBY 命令使用 WRAP 方式來處理溢出計(jì)算。

4.優(yōu)點(diǎn)

省空間

5.缺點(diǎn)

暫無,雖然一個(gè)標(biāo)識(shí)位只能記錄一個(gè)用戶,那也夠用了畢竟你沒有2^32-1的數(shù)據(jù)量

6.實(shí)現(xiàn)場景點(diǎn)贊

新增redis方法setbit

//bitmap/** * Sets the bit at {@code offset} in value stored at {@code key}. * * @param key must not be {@literal null}. * @param offset * @param value * @since 1.5 * @see <a href="http://redis.io/commands/setbit">Redis Documentation: SETBIT</a> */Boolean setBit(K key, long offset, boolean value);/** setbit* */public Boolean setBitMap(String key,long commentDatailId,boolean value){return  redisTemplate.opsForValue().setBit(key,commentDatailId,value);}

在命令中value是標(biāo)識(shí)1或0的,也就是true/false對應(yīng)值

key:設(shè)置的key,比如日活,簽到,就用時(shí)間+id,那標(biāo)識(shí)點(diǎn)贊未點(diǎn)贊就用信息id即可

offset:即所占標(biāo)識(shí)位,一看就想起來偏移量

value:設(shè)置0/1

Boolean :返回0或1來標(biāo)識(shí)是否

boolean flag = redisService.setBitMap(userIdStr,commentDetailId,true);

以前的邏輯不變set之前判斷是否存在

if(redisService.getBitMap(userIdStr,commentDetailId)){    redisService.setBitMap(userIdStr,commentDetailId,true);}else{    redisService.setBitMap(userIdStr,commentDetailId,false);}

問題:如果我的id很大或者是uuid開始呢?

正常的id是不會(huì)的,但uuid有可能,如果是uuid可以使用uuid減去初始位來進(jìn)行放置

實(shí)現(xiàn)場景大數(shù)據(jù)量黑名單

此業(yè)務(wù)適合大數(shù)據(jù)量業(yè)務(wù)存儲(chǔ)的占用空間問題,而且基于redis速度不用擔(dān)心

日活統(tǒng)計(jì)

bitop and time moday thurday

1.節(jié)約空間,統(tǒng)計(jì)一億人每天的登錄情況,用一億bit,約1200WByte,約10M的字符就能表示(因?yàn)閎itop命令的返回值是保存到 time中的字符串的長度(以字節(jié)byte為單位),和輸入 key 中最長的字符串長度相等。即1億除以8bit=1250萬Byte);

2.計(jì)算方便

性能:

??如果你的 bitmap 數(shù)據(jù)非常大,那么可以考慮使用以下兩種方法:

● 將一個(gè)大的 bitmap 分散到不同的 key 中,作為小的 bitmap 來處理。使用 Lua 腳本可以很方便地完成這一工作。

● 使用 BITCOUNT 的 start 和 end 參數(shù),每次只對所需的部分位進(jìn)行計(jì)算,將位的累積工作(accumulating)放到客戶端進(jìn)行,并且對結(jié)果進(jìn)行緩存 (caching)。

何時(shí)使用:

??如果活躍用戶在百萬級(jí)別,使用Redis BitMap很劃算。

??如果活躍用戶很少,而用戶id都是10位以上的int。那就很浪費(fèi)內(nèi)存了,還不如使用set集合,然后求交集就可以了。

“bitmap的相關(guān)命令有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI