Redis命令介紹之字符串值的操作

前文中我們介紹了Redis中對於字符串類型的鍵值對進行諸如設置、獲取、刪除等操作的命令。在本文中,我們將繼續介紹Redis中字符串類型的相關命令,主要爲對該類型鍵值對值的操作。

STRLEN

STRLEN命令被用於獲取指定字符串類型鍵值對值的長度。當鍵值對不存在時將返回0,若鍵值對值類型不爲字符串時,將返回錯誤。

STRLEN key

示例

redis> STRLEN greeting
(integer) 0
redis> SET greeting "hello redis"
OK
redis> STRLEN greeting
(integer) 11
# 當鍵值對不爲字符串時
redis> LPUSH students "John Doe" "Jane Doe"
(integer) 2
redis> STRLEN students
(error) WRONGTYPE Operation against a key holding the wrong kind of value

GETRANGE

GETRANGE命令的作用爲獲取字符串值中由startend參數指定範圍的子串(包含startend位置的字符)。當偏移值爲負數時,指相對於字符串結尾的偏移量。例如當值爲redis時,偏移量-1指的是最後一個字符s,偏移量-2指的是倒數第二個字符i

當偏移量超出字符串的長度時,將會忽略超出的部分。例如值爲redis時,獲取偏移量從010的子串,仍將只返回redis

GETRANGE key start end

GETRANGE命令在Redis 2.4.0中被添加,用於替代2.0之前版本中的SUBSTR命令。

示例

redis> SET greeting "hello"
OK
redis> GETRANGE greeting 0 4
"hello"
redis> GETRANGE greeting 0 -1
"hello redis"
redis> GETRANGE greeting -5 -1
"redis"
# 當偏移量超出字符串長度時
redis> GETRANGE greeting 0 20
"hello redis"
# 當偏移量錯誤時
redis> GETRANGE greeting 8 3
""

SETRANGE

SETRANGE命令用於覆蓋字符串中從偏移量開始的子串,並返回修改後的字符串長度。若偏移量大於原字符串的長度,將使用0值(數值0,非字符0)填充。

SETRANGE key offset value

由於Redis中字符串的最大長度爲512 MB(229),所以偏移量的最大值爲536870911(229 - 1)。

示例

redis> SET greeting "hexxo guys"
OK
redis> SETRANGE greeting 6 "redis"
(integer) 11
redis> GET greeting
"hexxo redis"
# 只修改部分字符
redis> SETRANGE greeting 2 "ll"
(integer) 11
redis> GET greeting
"hello world"
# 偏移量大於原字符串長度
redis> SETRANGE name 5 "John Doe"
(integer) 13
redis> GET name
"\x00\x00\x00\x00\x00John Doe"

APPEND

APPEND命令的作用爲當指定鍵存在且爲字符串類型時,將指定的值拼接到現有值的最後。若指定鍵不存在時,其作用類似於使用SET命令,即創建一個空串並拼接參數指定的字符串。

APPEND key value

示例

redis> EXISTS greeting
(integer) 0
redis> APPEND greeting "hello"
(integer) 5
redis> APPEND greeting " world"
(integer) 11
redis> GET greeting
"hello world"

EXISTS

APPEND命令的示例中我們提到了一個EXISTS命令,該命令用於獲取指定鍵中存在的數量。若指定的鍵存在,則該命令執行後將返回1,否則返回0。從Redis 3.0.3開始EXISTS命令支持獲取多個鍵存在的數量。

EXISTS命令和前文中的DEL等命令一樣,不僅限於字符串類型的鍵值對。

EXISTS key [key ...]

若參數中有重複的鍵,也將會被多次計數。例如下面示例中,使用EXISTS key1 key1 key2命令,參數中指定的兩個key1也將被重複計數,其返回結果爲3。

示例

redis> MSET key1 "value1" key2 "value2"
OK
redis> EXISTS key1
(integer) 1
redis> EXISTS key3
(integer) 0
redis> EXISTS key1 key2 key3
(integer) 2
# 重複的鍵名也會多次計數
redis> EXISTS key1 key1 key2
(integer) 3

INCR / INCRBY

當字符串的值可表示爲一個數值時,可使用INCRINCRBYDECRDECRBY以及INCRBYFLOAT命令進行遞增或遞減的操作。

Redis中並不存在專門的整數類型,它們將以字符串的形式被儲存,所以我們上面提到的幾個命令也都是字符串的操作命令。在執行這些命令前,Redis會將對應的字符串解析爲對應的64位有符號整數。若鍵值不爲字符串或字符串無法被解析爲指定範圍的整數,將會返回錯誤。同樣,執行操作得到的結果也必須爲在64爲有符號整數所內表示的範圍內。

INCR命令的作用爲將字符串對應的整數值遞增1,並返回遞增後的整型值。在執行該命令前,若鍵不存在,則將自動創建並設置其值爲0。

INCR key

INCRBY命令與INCR類似,二者區別爲INCRBY命令可指定遞增的值,且該值可爲在可表示範圍內的任意整數值。

INCRBY key increment

示例

redis> INCR count
(integer) 1
redis> GET count
"1"
redis> INCRBY count 2
(integer) 3
redis> INCRBY count -1
(integer) 2

當字符串的值不爲整數值或超出範圍時,將返回錯誤:

# 非整數值
redis> SET greeting "hello"
OK
redis> INCR greeting
(error) ERR value is not an integer or out of range
# 超出範圍
redis> SET count 9223372036854775806
OK
redis> INCR count
(integer) 9223372036854775807
redis> INCR count
(error) ERR value is not an integer or out of range

DECR / DECRBY

DECRDECRBY命令的作用以及使用方法與上一節中的INCRINCRBY相似,區別爲這兩個命令做的是遞減的操作。同樣,DECRDECRBY命令也受64位有符號整數範圍的限制。

DECR key
DECRBY key decrement

INCRBY的遞增值以及DECRBY的遞減值都可爲負數,所以二者的也可被相互替代。例如INCRBY key 1等價於DECRBY key -1

示例

redis> DECR count
(integer) -1
redis> GET count
"-1"
redis> DECRBY count 2
(integer) -3
redis> DECRBY count -1
(integer) -2

INCRBYFLOAT

INCRBYFLOAT與上述四個命令有較爲明顯的區別,它會將字符串解析爲雙精度浮點數(double類型),且遞增的值接受浮點數。同樣,若鍵不存在則會將其值設置爲0,若鍵值對不爲字符串類型或無法解析爲雙精度浮點數則會返回錯誤。

INCRBYFLOAT命令執行後會將計算得到的結果保存只鍵值對中並返回對應的值,返回的值爲字符串值而非上述命令一樣的整型值。

INCRBYFLOAT key increment

使用INCRBYFLOAT命令時,原字符串的值及遞增的值都可包含指數,但在計算後將被保存爲小數的形式。在計算後,小數點後多餘的0將被刪除。浮點數的計算會存在精度的問題,計算的結果最多隻保留小數點後的17位。

示例

redis> SET balance 1000
OK
redis> INCRBYFLOAT balance 50.5
"1050.5"
redis> INCRBYFLOAT balance -100.5
"950"

當值爲指數時,使用INCRBYFLOAT命令後將被轉換爲小數的形式:

redis> SET pi 314e-2
OK
redis> INCRBYFLOAT pi 0.0
"3.14"
redis> GET pi
"3.14"

結束語

上文中爲大家介紹了Redis中對字符串類型的值進行操作的一些命令,接下來的文章中將會繼續爲大家介紹位操作的命令以及Redis中其它類型的命令。

歡迎大家關注我的公衆號“風紙”,或是掃下面的二維碼關注👇
風紙

參考文獻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章