真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)過(guò)程中,需要針對(duì)客戶(hù)的行業(yè)特點(diǎn)、產(chǎn)品特性、目標(biāo)受眾和市場(chǎng)情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計(jì)方向。成都創(chuàng)新互聯(lián)還需要根據(jù)客戶(hù)的需求進(jìn)行功能模塊的開(kāi)發(fā)和設(shè)計(jì),包括內(nèi)容管理、前臺(tái)展示、用戶(hù)權(quán)限管理、數(shù)據(jù)統(tǒng)計(jì)和安全保護(hù)等功能。

1.使用場(chǎng)景

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

2.原理

就是通過(guò)一個(gè)bit位來(lái)表示某個(gè)元素對(duì)應(yīng)的值或者狀態(tài),其中的key就是對(duì)應(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。<來(lái)自官方文檔>

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

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

3.命令

命令

作用

setbit

設(shè)置Bitmap的值

getbit

獲取Bitmap的值

bitcount

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

destkey

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

                                              BITOP

BITOP operation destkey key [key ...],

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 作為輸入

     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]

溢出控制

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

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

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

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

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

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

省空間

5.缺點(diǎn)

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

6.實(shí)現(xiàn)場(chǎng)景點(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 Redis Documentation: SETBIT */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對(duì)應(yīng)值

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

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

value:設(shè)置0/1

Boolean :返回0或1來(lái)標(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);}

問(wèn)題:如果我的id很大或者是uuid開(kāi)始呢?

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

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

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

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

bitop and time moday thurday

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

2.計(jì)算方便

性能:

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

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

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

何時(shí)使用:

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

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

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


本文標(biāo)題:bitmap的相關(guān)命令有哪些
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/pcpshp.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部