4 redis資料型別之String bit

2021-10-03 04:14:27 字數 3364 閱讀 1328

原文:

bit相關的命令指的是 bitcount , bitfield, bitop, bitpos, setbit, getbit 幾個命令。

在學習這幾個命令之前。我們需要知道,redis中的字串的儲存方式,是採用二進位制的方式進行儲存的,如果下面的命令:

127.0.0.1:6379>

set name a

ok

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

getbit 命令可以返回key對應的value在offset處的bit值。例如如上key為name,value為a。a對應的二進位制是 0110 0001,所以當offset為0時,對應的bit值是0.當offset為1時,對應的bit值是1,offset為2時,對應的bit值為1…以此類推。 如下:

127.0.0.1:6379>

set name a

ok127.0.0.1:6379> getbit name 0

(integer) 0

127.0.0.1:6379> getbit name 1

(integer) 1

127.0.0.1:6379> getbit name 2

(integer) 1

127.0.0.1:6379> getbit name 3

(integer) 0

127.0.0.1:6379> getbit name 4

(integer) 0

127.0.0.1:6379> getbit name 5

(integer) 0

127.0.0.1:6379> getbit name 6

(integer) 0

127.0.0.1:6379> getbit name 7

(integer) 1

setbit命令可以用來修改二進位制資料,比如a對應的ascii碼對應為97,而 b的ascii碼對應為98. 98所對應的二進位制數為 0110 0010.下面我們通過setbit來修改對應位置上的資料。只需將第六位設定1,第七位設定為0即可。如下:

127.0.0.1:6379> setbit name 6 1

(integer) 0

127.0.0.1:6379> setbit name 7 0

(integer) 1

127.0.0.1:6379> get name

"b"

此時,name的儲存的字串由a變成了b。setbit在執行時返回的資料,表示該位置上原來的bit值。

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

127.0.0.1:6379>

set name a

ok127.0.0.1:6379> bitcount name

(integer) 3

舉乙個例子,如果今天是**上線的第100天,而使用者peter在今天瀏覽過**,那麼執行命令 setbit peter 100 1; 如果明天也繼續瀏覽了**,那麼執行命令setbit peter 101 1,以此類推。當要計算peter總共以來上線了多少次。就可以是用bitcount命令。執行bitcount peter,得出的結果就是peter上線的總天數。

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

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

127.0.0.1:6379>

set k1 a

ok127.0.0.1:6379>

set k2 c

ok127.0.0.1:6379> bitop and k3 k1 k2

(integer) 1

127.0.0.1:6379> get k3

"a"127.0.0.1:6379> bitop or k3 k1 k2

(integer) 1

127.0.0.1:6379> get k3

"c"127.0.0.1:6379> bitop xor k3 k1 k2

(integer) 1

127.0.0.1:6379> get k3

"\x02"

另外,bitop也可以執行not操作,但是只需乙個引數,如下:

127.0.0.1:6379> bitop not k3 k1

(integer) 1

127.0.0.1:6379> get k3

"\x9e"

下面我們手動來驗證一下:a = > 0110 0001. c => 011 0011

and.

1 1 得 1, 1 0 得 0 , 0 1 得 0 , 0 0 得 0;

0 1 1 0 0 0 0 1

0 1 1 0 0 0 1 1

0 1 1 0 0 0 0 1 => a

or.1 1 得 1,1 0 得 1, 0 1 得 1, 0 0 得 0

0 1 1 0 0 0 0 1

0 1 1 0 0 0 1 1

0 1 1 0 0 0 1 1 => c

xor.

1 1 得 0,1 0 得 1 ,0 1 得 1 ,0 0 得 0

0 1 1 0 0 0 0 1

0 1 1 0 0 0 1 1

0 0 0 0 0 0 1 0 => 2 轉為16進行為 2

not.

0 1 1 0 0 0 0 1

1 0 0 1 1 1 1 0 => 2^7 + 2^ 4 + 2^3 + 2^2 + 2^1 = 128 + 16 + 8 + 4 + 2 = 158 轉為16進製為 9e

bitops 用來獲取二進位制位串中第乙個1或者0 的位置。如下:

127.0.0.1:6379> bitpos k1 1

(integer) 1

127.0.0.1:6379> bitpos k1 0

(integer) 0

也可以在後面設定乙個範圍,不過後面的範圍是位元組的範圍,而不是二進位制位串的範圍。

關於redis的bit字串型別就先介紹到這裡,如果需要更加詳細的文件,可以移步官方文件:

Redis學習筆記4 Redis資料儲存優化機制

1.zipmap優化hash 前面談到將乙個物件儲存在hash型別中會占用更少的記憶體,並且可以更方便的訪問整個物件。省記憶體的原因是新建乙個hash物件時開始是用zipmap來儲存的。這個zipmap其實並不是hash table,但是zipmap相比正常的hash實現可以節省不少hash本身需要...

Redis之資料型別

與mysql資料庫支援的多種資料型別相比,redis資料庫支援的資料型別要少上許多。redis資料庫支援五種資料型別 string 字串 hash 雜湊 list 列表 set 集合 及zset sorted set 有序集合 string 是 redis 最基本的型別,你可以理解成與 memcac...

Redis 資料型別之雜湊型別

營口小書生 2017 05 11 15 26 redis 有很多種型別,現在我們不用想太多,看此篇文章,你只需要記得你 雜湊型別 就好 雜湊型別顧名思義就是字段分開儲存的,可以自由更改值,不需要先讀取整篇內容在更改其中乙個 然後在儲存更新原有的,這樣是不是很簡單啊,還能保證資料的一致性,不用擔心改錯...