Redis介紹 String型別之BIT(五)

2021-09-21 14:42:52 字數 3099 閱讀 2440

本文時redis系列的第五篇文章,了解前面的文章有助於更好的理解本文:

redis介紹–linux系統下的安裝(一)

redis介紹–通用命令介紹(二)

redis介紹–五大資料型別介紹(三)

redis介紹–string資料型別介紹(四)

bit相關的命令是指bitcount、bitfield、bitop、bitpos、setbit、getbit幾個命令,靈活使用這幾個命令,可以給我們的專案帶來很多驚喜。

在學習前,我們要先了解下redis中字串的儲存方式,redis中的字串都是以二進位制的方式進行儲存的,比如以下命令:

127.0.0.1:6379> set k1 a

ok

a對應的ascii碼是97,轉換為二進位制資料是01100001,我們bit相關命令都是對這個二進位制資料進行操作。

getbit命令可以返回key對應的value在offset處的bit值,以上文提到的k1為例子,a對應的二進位制資料是01100001,所以當offset為0時,對應的bit值為0;offset為1時,對應的bit值為1;offset為2時,對應的bit值為1;offset為3時,對應的bit值為0,以此類推…,如下:

127.0.0.1:6379> getbit k1 0

(integer) 0

127.0.0.1:6379> getbit k1 1

(integer) 1

127.0.0.1:6379> getbit k1 2

(integer) 1

127.0.0.1:6379> getbit k1 3

(integer) 0

127.0.0.1:6379> getbit k1 4

(integer) 0

127.0.0.1:6379> getbit k1 5

(integer) 0

127.0.0.1:6379> getbit k1 6

(integer) 0

127.0.0.1:6379> getbit k1 7

(integer) 1

setbit可以用來修改二進位制資料,比如a對應的ascii碼為97,c對應的ascii碼為99,97轉為二進位制是01100001,99轉為二進位制是01100011,兩個的差異在於第六位乙個是0乙個是1,通過setbit命令,我們可以將k1的第六的0改為1(第六位是從0開始算),如下:

127.0.0.1:6379> get k1

"a"127.0.0.1:6379> setbit k1 6 1

(integer) 0

127.0.0.1:6379> get k1

"c"127.0.0.1:6379>

此時,k1中儲存的字元也就變成了c。setbit在執行時返回的數字,表示該位上原本的bit值。

bitcount可以用來統計這個二進位制資料中1的個數,如下:

127.0.0.1:6379> get k1

"c"127.0.0.1:6379> bitcount k1

(integer) 4

關於bitcount,redis官網上有乙個案例,用於統計使用者上線次數。原文如下:

這種統計方式最大的好處就是節省空間並且運算速度快。每天占用乙個bit,一年也就365個bit,10年也就是10*365個bit,也就是456個位元組,對於這麼大的資料,bit的操作速度非常快。

bitop可以對乙個或者多個二進位制位串執行並(and)、或(or)、異或(xor)以及非(not)運算,如下:a對應的ascii碼轉為二進位制是01100001,c對應的二進位制位串是01100011。對這兩個二進位制位串分別執行and、or、xor、的結果如下:

127.0.0.1:6379> mget s1 s2

1) "a"

2) "c"

127.0.0.1:6379> bitop and s3 s1 s2

(integer) 1

127.0.0.1:6379> mget s1 s2 s3

1) "a"

2) "c"

3) "a"

127.0.0.1:6379>

127.0.0.1:6379> bitop or s3 s1 s2

(integer) 1

127.0.0.1:6379> mget s1 s2 s3

1) "a"

2) "c"

3) "c"

127.0.0.1:6379> bitop xor s3 s1 s2

(integer) 1

127.0.0.1:6379> mget s1 s2 s3

1) "a"

2) "c"

3) "\x02"

注意:bitop執行not運算時,要注意引數的個數,如下:

127.0.0.1:6379> mget s1 s2 s3 s4

1) "a"

2) "c"

3) (nil)

4) (nil)

127.0.0.1:6379> bitop not s3 s1

(integer) 1

127.0.0.1:6379> mget s1 s2 s3 s4

1) "a"

2) "c"

3) "\x9e"

4) (nil)

127.0.0.1:6379>

這裡會對s1的二進位制位串取反,將取反結果交給s3。

bitpos用來獲取二進位制位串中第乙個1或者0的位置

返回乙個位置,把字串當做乙個從左到右的位元組陣列,第乙個符合條件的在位置0,其次在位置8,等等。還是以a為例01100001如下:

127.0.0.1:6379> set s1 a

ok127.0.0.1:6379> bitpos s1 1

(integer) 1

127.0.0.1:6379> bitpos s1 0

(integer) 0

ok!!!string中bit相關命令就介紹到此,如有需要的童鞋們可以參考官網文件:

redis語法 String型別

127.0.0.1 6379 set k1 v1 ok127.0.0.1 6379 get k1 v1 127.0.0.1 6379 del k1 integer 1 127.0.0.1 6379 get k1 nil 127.0.0.1 6379 set k2 v2 ok integer 9 12...

關於 String 型別介紹

表示可變長的字串行,使用string型別前必須首先包含string標頭檔案 string a1 預設初始化 string a2 a1 a2是a1的副本 string a3 a1 等價於a3 a1 a3是a1的副本 string a4 hello world a4是字面值 hello world 的副...

redis資料型別(String)

常用string操作命令 set keyvalue 設定值 getkey 獲取值 value 追加值 incr key 原子操作,自動加1 value必須為inter型別的字元。decr key 原子操作,自動減1 value必須為inter型別的字元。incrby key num 自動增加指定值 ...