Redis是一個當前非常流行的開源內存數據庫,它支持包括字符串(String)、列表(List)、哈希集合(Hash)、集合(Set)、有序集合(Sorted Set)五種數據類型。在接下來一系列文章中,將在Redis支持的數據類型的基礎上,介紹相關的操作命令。作爲開篇,本文將先介紹字符串類型的操作命令。
本文中除特別註明的命令外,都只可被用於操作字符串類型的鍵值對。
SET
SET
命令爲指定名稱的鍵設置字符串類型的值,若鍵已存在則覆蓋舊值(未指定特定參數的情況下)。
SET key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]
可選參數
SET
命令有EX
、PX
、NX
、XX
以及KEEPTTL
五個可選參數,其中KEEPTTL
爲6.0版本添加的可選參數,其它爲2.6.12版本添加的可選參數。
EX seconds
以秒爲單位設置過期時間PX milliseconds
以毫秒爲單位設置過期時間NX
鍵不存在的時候設置鍵值XX
鍵存在的時候設置鍵值KEEPTTL
保留設置前指定鍵的生存時間
SET
命令使用EX
、PX
、NX
參數,其效果等同於SETEX
、PSETEX
、SETNX
命令。根據官方文檔的描述,未來版本中SETEX
、PSETEX
、SETNX
命令可能會被淘汰。
返回值
設置成功則返回OK
;返回nil
爲未執行SET
命令,如不滿足NX
、XX
條件等。
示例
設置greeting
鍵的值,並隨後設置新值:
# 設置鍵名greeting的值爲hello world
redis> SET greeting "hello world"
OK
# 獲取greeting鍵的值
redis> GET greeting
"hello world"
# 爲greeting鍵設置新值
redis> SET greeting "hello redis"
OK
redis> GET greeting
"hello redis"
使用EX
參數設置過期時間,並使用NX
參數在鍵不存在的時候設置鍵值:
# 爲greeting鍵設置10秒的過期時間
redis> SET greeting "hello world" EX 10
OK
# 獲取剩餘生存時間
redis> TTL greeting
9
# 鍵不存在時設置
redis> SET greeting "hello redis" NX
(nil)
# 等待greeting過期後,使用TTL命令獲取到的生存時間爲-2
redis> TTL greeting
-2
# 使用NX參數設置成功
redis> SET greeting "hello redis" NX
OK
使用KEEPTTL
參數將會保留原鍵的生存時間:
redis> SET greeting "hello world" EX 100
OK
redis> TTL greeting
(integer) 99
redis> SET greeting "hello redis" KEEPTTL
OK
redis> TTL greeting
(integer) 97
GET
GET
命令爲獲取指定名稱鍵的鍵值。
GET key
返回值
- 當鍵存在且值爲字符串時返回對應的值;
- 當鍵不存在時返回
nil
; - 當鍵值不爲字符串時返回錯誤。
示例
redis> SET greeting "hello world"
OK
redis> GET greeting
"hello world"
redis> GET age
(nil)
當使用GET
命令獲取的鍵不爲字符串時將返回錯誤:
# LPUSH爲列表類型命令
redis> LPUSH students "John Doe"
(integer) 1
redis> GET students
(error) WRONGTYPE Operation against a key holding the wrong kind of value
GETSET
GETSET
命令用於設置鍵值對的值並返回舊值,若鍵值對不存在則返回nil
。若鍵存在但不爲字符串類型,則返回錯誤。
GETSET key value
示例
redis> SET greeting "hello world"
OK
redis> GETSET greeting "hello redis"
"hello world"
redis> GET greeting
"hello redis"
DEL
DEL
命令被用於刪除指定的一個或多個鍵值對,當其中某個鍵值對不存在時將被忽略。DEL
命令可被用於所有數據類型,不僅限於字符串。
DEL key [key ...]
DEL
將返回被刪除的鍵值對個數。
示例
redis> SET key1 "value1"
OK
redis> SET key2 "value2"
OK
redis> DEL key1 key2 key3
(integer) 2
EXPIRE / PEXPIRE
EXPIRE
命令被用於設置某個鍵的過期時間,其值以秒作爲單位。當設置過期時間後使用SET
(不使用KEEPTTL
參數)、GETSET
等命令,所設置的過期時間將被覆蓋。EXPIRE
可被用於所有數據類型,不僅限於字符串。
EXPIRE key seconds
PEXPIRE
命令以毫秒作爲單位設置某個鍵的過期時間。
PEXPIRE key milliseconds
使用EXPIRE
或PEXPIRE
命令時,若傳入的過期時間爲一個非正整數,該鍵值對將被刪除(觸發的事件爲del
而非expire
,即該鍵爲被刪除而不是過期)。
返回值
- 當過期時間被設置,則返回
1
- 當鍵不存在,則返回
0
示例
redis> SET greeting "hello"
OK
redis> EXPIRE greeting 10
(integer) 1
redis> TTL greeting
(integer) 9
# 覆蓋過期時間
redis> SET greeting "hello redis"
OK
redis> TTL greeting
(integer) -1
# 爲不存在的鍵設置過期時間
redis> EXPIRE none 10
(integer) 0
TTL / PTTL
TTL
命令用於獲取指定鍵的剩餘生存時間(time to live, TTL),其值已秒作爲生存時間的單位。TTL
命令可被用於所有數據類型,不僅限於字符串。
TTL key
PTTL
命令同樣用於獲取指定鍵的剩餘生存時間,與TTL
區別爲其以毫秒作爲單位。
PTTL key
返回值
- 當鍵設置過期時間時,返回剩餘的生存時間
- 當鍵存在但未設置過期時間時,返回
-1
- 當鍵不存在時,返回
-2
示例
redis> SET greeting "hello world"
OK
redis> TTL greeting
(integer) -1
# 設置10秒的過期時間
redis> EXPIRE greeting 10
(integer) 1
redis> TTL greeting
(integer) 9
# 等待greeting鍵過期
redis> TTL greeting
(integer) -2
SETEX / PSETEX
SETEX
命令爲指定名稱的鍵設置值,並以秒爲單位設置其生存時間。
SETEX key seconds value
SETEX
命令效果等同於使用SET key value
及EXPIRE key seconds
命令,以及SET key value EX seconds
命令。SETEX
命令具備原子性,它等同於在MULTI
/EXEC
塊中使用SET
以及EXPIRE
命令。
redis> SET mykey 10 "test"
# 等同於
redis> SET mykey "test"
redis> EXPIRE mykey 10
# 等同於
redis> SET mykey "test" EX 10
PSETEX
命令與SETEX
命令相似,二者區別爲PSETEX
設置的生存時間以毫秒作爲單位。
PSETEX key milliseconds value
示例
SETEX
命令的使用:
# 過期時間不正確
redis> SETEX greeting -1 "hello"
(error) ERR invalid expire time in setex
redis> SETEX greeting 99999999999999 "hello"
(error) ERR value is not an integer or out of range
# 設置爭取的過期時間
redis> SETEX greeting 10 "hello"
OK
PSETEX
命令的使用:
# 生存時間爲10000毫秒(10秒)
redis> PSETEX greeting 10000 "hello"
OK
redis> PTTL greeting
(integer) 9885
redis> TTL greeting
(integer) 9
SETNX
當指定名稱的鍵不存在時設置字符串值,否則不執行操作。其效果等同於在鍵不存在時直接使用SET
命令,或是在任意情況下使用NX
參數。
SETNX key value
返回值
當成功設置鍵值時返回1
,否則返回0
(即鍵已存在的情況下)。
示例
redis> SETNX mykey "hello"
(integer) 1
redis> SETNX mykey "redis"
(integer) 0
redis> GET mykey
"hello"
MSET
MSET
命令用於設置一個或多個鍵值對,該命令永遠返回OK
。MSET
與SET
命令相同,都會替代存在的鍵的值。
MSET key value [key value ...]
MSET
命令具有原子性,所有的鍵都會一起被設置。其不存在一部分鍵值被更新,另一部分仍爲舊值的情況。
示例
redis> MSET key1 "value1" key2 "value2"
OK
redis> GET key1
"value1"
redis> GET key2
"value2"
MGET
MGET
用於獲取所有指定的鍵值。當某個鍵不存在時,將返回一個特殊的值nil
。
MGET key [key ...]
示例
redis> MSET key1 "value1" key3 "value3"
OK
redis> GET key1 key2 key3
1) "value1"
2) (nil)
3) "value3"
MSETNX
MSETNX
命令用於設置一個或多個鍵值對,僅當所有鍵都不存在時纔會執行。同樣,MSETNX
也具備原子性,所有的鍵會被一起被設置。
MSETNX key value [key value ...]
返回值
- 當所有的鍵被設置,則返回
1
- 當所有的鍵都沒有被設置,即至少一個鍵已存在的情況,則返回
0
示例
redis> MSETNX mykey1 "value1" mykey2 "value2"
(integer) 1
redis> MSETNX mykey2 "new value" myKey3 "value3"
(integer) 0
redis> MGET key1 key2 key3
1) "value1"
2) "value2"
3) (nil)
結束語
本文簡單的介紹了Redis中對於字符串類型鍵的一些基本操作命令,接下來的文章中將繼續介紹Redis中對字符串值操作的一些命令以及其它類型的操作命令。
歡迎大家關注我的公衆號“風紙”,或是掃下面的二維碼關注👇