Redis命令介紹之字符串鍵的基本操作

Redis是一個當前非常流行的開源內存數據庫,它支持包括字符串(String)、列表(List)、哈希集合(Hash)、集合(Set)、有序集合(Sorted Set)五種數據類型。在接下來一系列文章中,將在Redis支持的數據類型的基礎上,介紹相關的操作命令。作爲開篇,本文將先介紹字符串類型的操作命令。

本文中除特別註明的命令外,都只可被用於操作字符串類型的鍵值對。

SET

SET命令爲指定名稱的鍵設置字符串類型的值,若鍵已存在則覆蓋舊值(未指定特定參數的情況下)。

SET key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]

可選參數

SET命令有EXPXNXXX以及KEEPTTL五個可選參數,其中KEEPTTL爲6.0版本添加的可選參數,其它爲2.6.12版本添加的可選參數。

  • EX seconds 以秒爲單位設置過期時間
  • PX milliseconds 以毫秒爲單位設置過期時間
  • NX 鍵不存在的時候設置鍵值
  • XX 鍵存在的時候設置鍵值
  • KEEPTTL 保留設置前指定鍵的生存時間

SET命令使用EXPXNX參數,其效果等同於SETEXPSETEXSETNX命令。根據官方文檔的描述,未來版本中SETEXPSETEXSETNX命令可能會被淘汰。

返回值

設置成功則返回OK;返回nil爲未執行SET命令,如不滿足NXXX條件等。

示例

設置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

使用EXPIREPEXPIRE命令時,若傳入的過期時間爲一個非正整數,該鍵值對將被刪除(觸發的事件爲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 valueEXPIRE 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命令用於設置一個或多個鍵值對,該命令永遠返回OKMSETSET命令相同,都會替代存在的鍵的值。

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中對字符串值操作的一些命令以及其它類型的操作命令。

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

參考文獻

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