您好,登錄后才能下訂單哦!
小編給大家分享一下Redis位圖怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Redis也有這樣的結構名叫位圖,位圖最小的單位是bit,每個bit是由0或1構成,我們的字符串就是由很多個bit數組組成的,所以我們在使用位圖的時候是可以把一組bit轉換成字符串,也可以由字符串轉換成bit數組。
如下,“h”的ACSLL碼是0110 1000
> setbit name 1 1 #設置位圖的位置(integer) 0> setbit name 2 1(integer) 0> setbit name 4 1(integer) 0> get name #獲取這個位圖轉換成字符串的值"h"> getbit name 1 #獲取位圖的某個位置是否有值(integer) 1> getbit name 3(integer) 0
字符串轉位圖
> set kh h #存字符串OK> getbit kh 1 #第二個位置的bit是1(integer) 1> getbit kh 3 #第四個位置的bit是0(integer) 0
注意:如果對應位的字節是不可打印字符,redis會顯示該字符的十六進制形式。
> setbit x O 1(integer) 0> setbit x 1 1(integer) 0> get x"\xc0"
Redis位圖提供bitcount和bitpos指令,bitcount用來統計一定范圍內1的個數,bitpos用來查找指定范圍內出現的第一個0或者1。
這里我們需要注意的是參數start_index和end_index是字節索引,簡單的來說就是他們只能是8的倍數而不是指定值。
咱們對照下圖來看
> set name helloOK127.0.0.1:6379> bitcount name #計數所有的1的個數(integer) 21127.0.0.1:6379> bitcount name 0 1 #獲取前兩個字符出現1的個數(integer) 7127.0.0.1:6379> bitcount name 0 0 #獲取第一個字符出現1的個數(integer) 3127.0.0.1:6379> bitpos name 1 #獲取第一個1出現的位置(integer) 1127.0.0.1:6379> bitpos name 0 #獲取第一個0出現的位置(integer) 0127.0.0.1:6379> bitpos name 1 1 1 #獲取第二個字符1出現的位置(integer) 9
我們通過setbit和getbit指令來操作位圖都是一次操作一個位,那么有時候我們需要一次性操作多個位,如何操作呢?
在Redis3.2版本之前我們可以使用管道來一次性操作多個指令,redis給我們提供了bitfield指令,該指令有三個子指令分別是get、set、incrby它們都可以對指定位片段進行讀寫,但是最多只能處理64個連續的位,如果超過64位,就得使用多個子指令,bitfield 可以一次執行多個子指令。
下面我們來看例子,還是使用上面的name=hello
字母 | 數值 | 二進制 |
h | 104 | 0110 1000 |
e | 101 | 0110 0101 |
l | 108 | 0110 1100 |
l | 108 | 0110 1100 |
o | 111 | 0110 1111 |
> bitfield name get u4 0 #第一個位開始取4個位(0110),結果為無符號數(u)(integer) 6> bitfield name get u3 2 #第三個位開始取3個位(101),結果為無符號數(u)(integer) 5> bitfield name get i4 0 #第一個位開始取4個位(0110),結果為有符號數(i)(integer) 6> bitfield name get i3 2 #第三個位開始取3個位(101),結果為有符號數(i)(integer) -3
下面我們才試試批處理
> bitfield name get u4 0 get u3 2 get i4 0 get i3 2(integer) 6(integer) 5(integer) 6(integer) -3
有符號數是指獲取的位數組中第一個位是符號位,剩下的才是值。如果第一位是1,那就是負數。無符號數表示非負數,沒有符號位,獲取的位數組全部都是值。有符號數最多可以獲取 64 位,無符號數只能獲取 63 位(因為 Redis 協議中的integer是有符號數,最大 64 位,不能傳遞 64 位無符號值)。
下面我們來使用set,把hello的e變成a,a的ASCLL碼是97
>bitfield name set u8 8 97 #從第八位開始,接下來的8位用無符號的ASCLL碼97代替(integer)101 >get name"hallo"
這個指令用來自增,如果自增到最大值的時候會溢出,如果是無符號那么就變成0,如果是有符號的就會變成負數,向下自增反之。
bitfield指令提供溢出策略的指令overflow,用戶可以指定類型,默認為:wrap,溢出及折返,還可以選擇失敗:fail,失敗不執行,截斷:sat,溢出就停留。
> bitfield name incrby u4 2 1 #從第三個位開始,對接下來的4位元符號數+ 1(integer) 11> bitfield name incrby u4 2 1(integer) 12> bitfield name incrby u4 2 1(integer) 13> bitfield name incrby u4 2 1(integer) 14> bitfield name incrby u4 2 1(integer) 15####sat> bitfield name overflow sat incrby u4 2 1 #保持最大值(integer) 15####fail> bitfield name overflow fail incrby u4 2 1 #不執行(nil)####wrap> bitfield name incrby u4 2 1 #溢出折返(integer) 0
以上是“Redis位圖怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。