日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用

發(fā)布時(shí)間:2023/12/19 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.bitmap介紹

位圖不是真正的數(shù)據(jù)類(lèi)型,它是定義在字符串類(lèi)型中,一個(gè)字符串類(lèi)型的值最多能存儲(chǔ)512M字節(jié)的內(nèi)容

位上限:2^(9(512)+10(1024)+10(1024)+3(8b=1B))=2^32b

2.setbit設(shè)置某一位上的值

語(yǔ)法:SETBIT key offset value (offset位偏移量,從0開(kāi)始)

geekmooc:6379> flushall

OK

geekmooc:6379> setbit k1 1 1

0

geekmooc:6379> get k1

@

geekmooc:6379> setbit k1 7 1

0

geekmooc:6379> get k1

A

geekmooc:6379> setbit k1 7 2

ERR bit is not an integer or out of range

geekmooc:6379> setbit k1 9 1

0

geekmooc:6379> get k1

A@

3.getbit 獲取某一位上的值

語(yǔ)法:GETBIT key offset

geekmooc:6379> getbit k1 7

1

geekmooc:6379> getbit k1 8

0

geekmooc:6379> getbit k1 1

1

4.bitpos返回指定值0或者1在指定區(qū)間上首次出現(xiàn)的下標(biāo)

語(yǔ)法:BITPOS key bit [start] [end](字節(jié)索引,0表示第一個(gè)字節(jié))summary: Find first bit set or clear in a string

since: 2.8.7

group: string

不指定查找范圍,表示從全部?jī)?nèi)容中查找:BITPOS key bit

geekmooc:6379> keys *

k1

geekmooc:6379> bitpos k1 1

1

geekmooc:6379> setbit k1 1 0

1

geekmooc:6379> bitpos k1 1

7

geekmooc:6379> setbit k1 7 0

1

geekmooc:6379> bitpos k1 1

9

指定查找范圍:BITPOS key bit start :從start+1個(gè)字節(jié)開(kāi)始查找,直到尾部

BITPOS key bit start end:從start+1字節(jié)開(kāi)始到end+1字節(jié)之間查找

然后將數(shù)據(jù)還原:

geekmooc:6379> setbit k1 1 1

0

geekmooc:6379> setbit k1 7 1

0

查找演示:

geekmooc:6379> bitpos k1 1 0 0

1 #在第一個(gè)字節(jié)中查找1首次出現(xiàn)的下標(biāo)

geekmooc:6379> bitpos k1 1 0

1 #從第一個(gè)字節(jié)到值得最后一個(gè)字節(jié)查找1首次出現(xiàn)的下標(biāo)

geekmooc:6379> setbit k1 1 0

1 #將指定下標(biāo)的值改為0

geekmooc:6379> bitpos k1 1 0 0

7 #

geekmooc:6379> bitpos k1 1 0

7

geekmooc:6379> setbit k1 7 0

1

geekmooc:6379> bitpos k1 1 0 0

-1 #在第一個(gè)字節(jié)中沒(méi)有找到1,則返回-1

geekmooc:6379> bitpos k1 1 0

9 #從第一個(gè)字節(jié)到值得最后一個(gè)字節(jié)查找

geekmooc:6379> bitpos k1 1 0 1

9 #在第1和第2個(gè)字節(jié)總找1首次出現(xiàn)的位置

geekmooc:6379> bitpos k1 1 0 2

9 #在第1到第3個(gè)字節(jié)查找1首次出現(xiàn)的位置,但數(shù)據(jù)總共2(小于end對(duì)應(yīng)的3)個(gè)字節(jié),不會(huì)拋錯(cuò)。

5.bitop位操作

語(yǔ)法:BITOP operation destkey key [key ...]summary: Perform bitwise operations between strings

since: 2.6.0

group: string

對(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 的字符串序列

BITOP AND destkey key [key ...]演示:

geekmooc:6379> flushall

OK

geekmooc:6379> keys *

(empty list or set)

geekmooc:6379> setbit k1 1 1

(integer) 0

geekmooc:6379> setbit k2 7 1

(integer) 0

geekmooc:6379> bitop and k3 k1 k2

(integer) 1

geekmooc:6379> get k3

"\x00"全1為1,不全1為0

BITOP OR destkey key [key ...]演示

geekmooc:6379> bitop or k4 k1 k2

(integer) 1

geekmooc:6379> get k4

"A"

全0為0,不全0為1

BITOP XOR destkey key [key ...]

geekmooc:6379> bitop xor k5 k1 k2

(integer) 1

geekmooc:6379> get k5

"A"不同為1,相同為0

geekmooc:6379> bitop not k6 k1

(integer) 1

geekmooc:6379> get k6

"\xbf"按位取反

6.bitcount

統(tǒng)計(jì)指定位區(qū)間上值為1的個(gè)數(shù)BITCOUNT key [start] [end] start end 字節(jié)的索引 正方向

從左向右從0開(kāi)始,注意官方start、end是位,測(cè)試后是字節(jié)

geekmooc:6379> get k1

"@"

geekmooc:6379> bitcount k1

(integer) 1

geekmooc:6379> setbit k1 7 1

(integer) 0

geekmooc:6379> bitcount k1

(integer) 2

geekmooc:6379> setbit k1 9 1

(integer) 0

geekmooc:6379> bitcount k1

(integer) 3 #統(tǒng)計(jì)全部的1的總數(shù)

geekmooc:6379> bitcount k1 0 0

(integer) 2 #統(tǒng)計(jì)第一個(gè)字節(jié)中1出現(xiàn)的總數(shù)

geekmooc:6379> bitcount k1 0 1

(integer) 3 #統(tǒng)計(jì)第0+1到第1+1字節(jié)中1出現(xiàn)的總數(shù)BITCOUNT key [start] [end] start end 字節(jié)的索引 負(fù)方向

從右向左從-1開(kāi)始,注意官方start、end是位,測(cè)試后是字節(jié)

geekmooc:6379>BITCOUNT k1 0 -1 #等同于BITCOUNT k1

(integer) 3

最常用的就是 BITCOUNT k1

7.Redis的二進(jìn)制位

geekmooc:6379> set k7 ab

OK

geekmooc:6379> get k7

"ab"

geekmooc:6379> bitcount k7

(integer) 6

geekmooc:6379> bitcount k7 0 0

(integer) 3

geekmooc:6379> bitcount k7 1 1

(integer) 3

geekmooc:6379> set k8 中

OK

geekmooc:6379> bitcount k8

(integer) 13

geekmooc:6379> get k8

"\xe4\xb8\xad"如果是GBK環(huán)境下,如下圖

8.Bitmap應(yīng)用場(chǎng)景

網(wǎng)站用戶簽到的天數(shù)統(tǒng)計(jì)

用戶ID為key,天作為offset,上線置為1 366> 000000000000000

366 /8=46Byte ID為18的用戶,今年的第1天簽到、第30天簽到

geekmooc:6379[2]> setbit u18 1 1

(integer) 0

geekmooc:6379[2]> setbit u18 30 1

(integer) 0

geekmooc:6379[2]> bitcount u18 #統(tǒng)計(jì)id為18的用戶簽到總次數(shù)

(integer) 2

geekmooc:6379[2]> keys u*

1) "u18"

按天統(tǒng)計(jì)網(wǎng)站活躍用戶

天作為key,用戶ID為offset,上線置為1

求一段時(shí)間內(nèi)活躍用戶數(shù) 5000 0000 / 8*366= 6.3MB=*366 (五千萬(wàn)活躍用戶1年才產(chǎn)生2GB左右的數(shù)據(jù))

geekmooc:6379>SETBIT 20190601 5 1 #0000 0100

geekmooc:6379>SETBIT 20190602 7 1 #0000 0001

geekmooc:6379>SETBIT 20190603 7 1 #0000 0001

求6月1日到6月10日的活躍用戶數(shù)

geekmooc:6379>BITOP OR users 20190601 20190602 20190603 ... 20190610

geekmooc:6379>BITCOUNT users #目標(biāo)key為users

結(jié)果為2

用戶在線狀態(tài)、在線人數(shù)統(tǒng)計(jì)

geekmooc:6379> SETBIT online 5 1 #0000 0100 上線為1

(integer) 0

geekmooc:6379> SETBIT online 7 1 #0000 0101

(integer) 0

geekmooc:6379> bitcount online #當(dāng)前在線人數(shù)

(integer) 2

geekmooc:6379> SETBIT online 7 0

(integer) 1

geekmooc:6379> bitcount online #當(dāng)前在線人數(shù)

(integer) 1Redis bitmap 位圖 從入門(mén)到精通 基礎(chǔ) 實(shí)戰(zhàn) 妙用?www.geekmooc.cn

總結(jié)

以上是生活随笔為你收集整理的redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。