Redis字串 STRING 中BIT相關命令

2021-09-13 08:22:38 字數 2905 閱讀 2907

上篇文章我們對string資料型別中一些基本的命令進行了介紹,但是沒有涉及到bit相關的命令,本文我們就來看看幾個和bit相關的命令。

1.linux上安裝redis

2.redis中的五種資料型別簡介

3.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> setbit k1 6 1

(integer) 0

127.0.0.1:6379> get k1

"c"

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

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

127.0.0.1:6379> bitcount k1

(integer) 4

關於bitcount,redis官網上有乙個非常有意思的案例:使用者上線次數統計。節選部分原文如下:

舉個例子,如果今天是**上線的第 100 天,而使用者 peter 在今天閱覽過**,那麼執行命令 setbit peter 100 1 ;如果明天 peter 也繼續閱覽**,那麼執行命令 setbit peter 101 1 ,以此類推。

當要計算 peter 總共以來的上線次數時,就使用 bitcount 命令:執行 bitcount peter ,得出的結果就是 peter 上線的總天數。

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

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

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 k4

(integer) 1

這裡會對k4的二進位制位串取反,將取反結果交給k3.

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

127.0.0.1:6379> set k1 a

ok127.0.0.1:6379> bitpos k1 1

(integer) 1

127.0.0.1:6379> bitpos k1 0

(integer) 0

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

Redis字串 STRING 中BIT相關命令

1.linux上安裝redis 2.redis中的五種資料型別簡介 3.redis字串 string 介紹 bit相關的命令是指bitcount bitfield bitop bitpos setbit getbit 幾個命令,靈活使用這幾個命令,可以給我們的專案帶來很多驚喜。在學習這幾個命令之前,...

Redis字串 STRING 中BIT相關命令

bit相關的命令是指bitcount bitfield bitop bitpos setbit getbit 幾個命令,靈活使用這幾個命令,可以給我們的專案帶來很多驚喜。在學習這幾個命令之前,我們得先了解下redis中字串的儲存方式,redis中的字串都是以二進位制的方式進行儲存的,比如說我執行如下...

Redis系列 字串 String (六)

redis 字串資料型別的相關命令用於管理 redis 字串值,基本語法如下 redis 127.0 0.1 6379 command key nameredis 127.0 0.1 6379 set runoobkey redis okredis 127.0 0.1 6379 get runoob...