Redis(三)、支持數據類型及常用操作命令

Redis支持的數據結構及命令

第1章 支持數據結構類型

你也許已經知道Redis並不是簡單的key-value存儲,實際上他是一個數據結構服務器,支持不同類型的值。也就是說,你不必僅僅把字符串當作鍵所指向的值。下列這些數據類型都可作爲值類型:

數據類型

說明

Strings(字符串)

二進制安全的字符串

Lists(列表)

按插入順序排序的字符串元素的集合。他們基本上就是鏈表(linked lists

Sets(集合)

不重複且無序的字符串元素的集合。

Sorted sets(有序集合)

類似Sets,但是每個字符串元素都關聯到一個叫score浮動數值(floating number value)。裏面的元素總是通過score進行着排序,所以不同的是,它是可以檢索的一系列元素。(例如你可能會問:給我前面10個或者後面10個元素)。

Hashes(散列)

field和關聯的value組成的mapfieldvalue都是字符串的

bitmaps

通過特殊的命令,你可以將   String 值當作一系列 bits 處理:可以設置和清除單獨的 bits,數出所有設爲 1 bits 的數量,找到最前的被設爲 1 0 bit,等等。

hyperloglog

估計一個 set 中元素數量的概率性的數據結構。

geospatial(地理空間)


第2章 Redis常用命令

Redis命令十分豐富,包括的命令組有ClusterConnectionGeoHashesHyperLogLogKeysListsPub/SubScriptingServerSetsSorted SetsStringsTransactions一共14redis命令組兩百多個redis命令。

2.1 針對Key的命令

命令

命令說明

DEL

刪除給定的一個或多個 key

DUMP

序列化給定key,並返回被序列化的值

EXISTS

檢查給定的key是否存在

EXPIRE

key設置生存時間

EXPIREAT

EXPIRE類似,不過接受的時間參數是UNIX的時間戳

KEYS

查詢符合給定模式的key

MIGRATE

傳輸key到目標實例

MOVE

將當前數據庫的key移動到給定的數據庫db

OBJECT

命令允許從內部察看給定 key  Redis 對象

PRESIST

移除給定key的生存時間,結合EXPIRE使用

PEXPIRE

 EXPIRE 類似,但是它以毫秒爲單位設置 key 的生存時間

PEXPIREAT

EXPIREAT類似,但是它以毫秒爲單位設置 key 的生存時間

PTTL

TTL類似,但是它以毫秒爲單位返回key的剩餘生存時間

RANDOMKEY

從當前數據庫中隨機返回(不刪除)一個 key 

RENAME

 key 改名爲 newkey 

RENAMENX

當且僅當 newkey 不存在時,將 key 改名爲 newkey 

RESTORE

反序列化給定的序列化值,並將它和給定的 key 關聯。

SORT

返回或保存給定列表、集合、有序集合 key 中經過排序的元素。

TTL

以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)

TYPE

返回 key 所儲存的值的類型。

SCAN

增量迭代

2.1.1 DEL

刪除給定的一個或多個 key ,不存在的 key 會被忽略。

q  刪除單個key

10.0.0.16:6379> SET name liutao
OK
10.0.0.16:6379> DEL name
(integer) 1

q  刪除一個不存在的key

10.0.0.16:6379> EXISTS hehe
(integer) 0
10.0.0.16:6379> DEL hehe    #<==失敗,沒有key被刪除
(integer) 0

q  同時刪除多個key

10.0.0.16:6379> SET name "redis"
OK
10.0.0.16:6379> SET type "key-value store"
OK
10.0.0.16:6379> SET website "redis.com"
OK
10.0.0.16:6379> DEL name type website
(integer) 3

2.1.2 EXISTS

檢查給定 key 是否存在。若 key 存在,返回 1 ,否則返回 0 

10.0.0.16:6379> SET db "redis"
OK
10.0.0.16:6379> EXISTS db
(integer) 1
10.0.0.16:6379> DEL db
(integer) 1
10.0.0.16:6379> EXISTS db
(integer) 0

2.1.3 EXPIRE

EXPIRE key seconds

爲給定 key 設置生存時間,當 key 過期時(生存時間爲 0 ),它會被自動刪除。在 Redis 中,帶有生存時間的 key 被稱爲『易失的』(volatile)。使用 PERSIST 命令可以在不刪除 key 的情況下,移除 key 的生存時間,讓 key 重新成爲一個『持久的』(persistent) key 

10.0.0.16:6379> SET cache_page "www.google.com"
OK
10.0.0.16:6379> EXPIRE cache_page 30
(integer) 1
10.0.0.16:6379> TTL cache_page
(integer) 26
10.0.0.16:6379> EXPIRE cache_page 3000
(integer) 1
10.0.0.16:6379> TTL cache_page
(integer) 2999
10.0.0.16:6379> PERSIST cache_page
(integer) 1
10.0.0.16:6379> TTL cache_page
(integer) -1

2.1.4 KEYS

KEYS pattern,查詢符合給定模式patternkey

KEYS * :匹配數據庫中所有的key

KEYS h?llo :匹配 hello  hallo  hxllo 等。

KEYS h*llo :匹配 hllo  heeeeello 等。

KEYS h[ae]llo :匹配 hello  hallo ,但不匹配 hillo 

注:KEYS 的速度非常快,但在一個大的數據庫中使用它仍然可能造成性能問題,如果你需要從一個數據集中查找特定的 key ,你最好還是用 Redis 的集合結構(set)來代替。

10.0.0.16:6379> MSET one 1 two 2 three 3 four 4
OK
10.0.0.16:6379> KEYS *o*
1) "four"
2) "two"
3) "one"
10.0.0.16:6379> KEYS t??
1) "two"
10.0.0.16:6379> KEYS t????
1) "three"
10.0.0.16:6379> KEYS t[w]*
1) "two"
10.0.0.16:6379> KEYS *
1) "three"
2) "four"
3) "two"
4) "one"
5) "greeting"
6) "cache_page"

2.1.5 MIGRATE

MIGRATE host port key destination-db timeout [COPY] [REPLACE]

 key 原子性地從當前實例傳送到目標實例的指定數據庫上,一旦傳送成功, key 保證會出現在目標實例上,而當前實例上的 key 會被刪除。這個命令是一個原子操作,它在執行的時候會阻塞進行遷移的兩個實例,直到以下任意結果發生:遷移成功,遷移失敗,等待超時。

命令的內部實現是這樣的:它在當前實例對給定 key 執行 DUMP 命令 ,將它序列化,然後傳送到目標實例,目標實例再使用 RESTORE對數據進行反序列化,並將反序列化所得的數據添加到數據庫中;當前實例就像目標實例的客戶端那樣,只要看到 RESTORE 命令返回 OK ,它就會調用 DEL 刪除自己數據庫上的 key 

timeout 參數以毫秒爲格式,指定當前實例和目標實例進行溝通的最大間隔時間。這說明操作並不一定要在 timeout 毫秒內完成,只是說數據傳送的時間不能超過這個 timeout 數。

MIGRATE 命令需要在給定的時間規定內完成 IO 操作。如果在傳送數據時發生 IO 錯誤,或者達到了超時時間,那麼命令會停止執行,並返回一個特殊的錯誤: IOERR 。當 IOERR 出現時,有以下兩種可能:

1key 可能存在於兩個實例

2key 可能只存在於當前實例

唯一不可能發生的情況就是丟失 key ,因此,如果一個客戶端執行 MIGRATE 命令,並且不幸遇上 IOERR 錯誤,那麼這個客戶端唯一要做的就是檢查自己數據庫上的 key 是否已經被正確地刪除。如果有其他錯誤發生,那麼 MIGRATE 保證 key 只會出現在當前實例中。(當然,目標實例的給定數據庫上可能有和 key 同名的鍵,不過這和 MIGRATE 命令沒有關係)。

可選項:

COPY :不移除源實例上的 key 

REPLACE :替換目標實例上已存在的 key 

10.0.0.16上操作:

10.0.0.16:6379> flushdb
OK
10.0.0.16:6379> keys *
(empty list or set)
10.0.0.16:6379> clear
10.0.0.16:6379> SET greeting "Hellp from 10.0.0.16 6379 instance"
OK
10.0.0.16:6379> MIGRATE 10.0.0.11 6379 greeting 0 1000
OK
10.0.0.16:6379> EXISTS greeting
(integer) 0

10.0.0.11上操作:

10.0.0.11:6379> keys *
1) "greeting"
10.0.0.11:6379> get greeting
"Hellp from 10.0.0.16 6379 instance"

2.1.6 TYPE

返回key所存儲的值的類型

返回值:

nonekey不存在)

string (字符串)

list (列表)

set (集合)

zset (有序集)

hash (哈希表)

10.0.0.16:6379> SET weather "sunny"
OK
10.0.0.16:6379> TYPE weather
string
10.0.0.16:6379> LPUSH book_list "programming in scala"
(integer) 1
10.0.0.16:6379> TYPE book_list
list
10.0.0.16:6379> SADD pat "dog"
(integer) 1
10.0.0.16:6379> TYPE pat
set

2.2 針對String

命令

命令說明

APPEND

 value 追加到 key 原來的值的末尾

STRLEN

返回 key 所儲存的字符串值的長度

INCR

 key 中儲存的數字值增一

INCRBY

 key 所儲存的值加上增量 increment 

DECR

 key 中儲存的數字值減一

DECRBY

 key 所儲存的值減去減量 decrement 

GET

返回 key 所關聯的字符串值

GETRANGE

返回 key 中字符串值的子字符串

MGET

返回所有(一個或多個)給定 key 的值

MSET

同時設置一個或多個 key-value 對。

2.2.1 APPEND

如果 key 已經存在並且是一個字符串, APPEND 命令將 value 追加到 key 原來的值的末尾。

如果 key 不存在, APPEND 就簡單地將給定 key 設爲 value ,就像執行 SET key value 一樣。

10.0.0.16:6379> EXISTS myphone
(integer) 0
10.0.0.16:6379> APPEND myphone "nokia"
(integer) 5
10.0.0.16:6379> APPEND myphone "- 1110"
(integer) 11
10.0.0.16:6379> GET myphone
"nokia- 1110"

2.2.2 DECR

DECR key

 key 中儲存的數字值減一。

如果 key 不存在,那麼 key 的值會先被初始化爲 0 ,然後再執行 DECR 操作。

如果值包含錯誤的類型,或字符串類型的值不能表示爲數字,那麼返回一個錯誤。

本操作的值限制在 64 (bit)有符號數字表示之內。

10.0.0.16:6379> SET failure_times 10
OK
10.0.0.16:6379> DECR failure_times
(integer) 9
10.0.0.16:6379> DECR failure_times
(integer) 8
10.0.0.16:6379> EXISTS count
(integer) 0
10.0.0.16:6379> DECR count
(integer) -1
10.0.0.16:6379> set company YOUR_CODE_SUCKS.LIC
OK
10.0.0.16:6379> DECR company
(error) ERR value is not an integer or out of range

2.2.3 DECRBY

DECR key decrement

 key 中儲存的數字值減去減量decrement

如果 key 不存在,那麼 key 的值會先被初始化爲 0 ,然後再執行 DECRBY操作。

如果值包含錯誤的類型,或字符串類型的值不能表示爲數字,那麼返回一個錯誤。

本操作的值限制在 64 (bit)有符號數字表示之內。

10.0.0.16:6379> SET count 100
OK
10.0.0.16:6379> DECRBY count 20
(integer) 80
10.0.0.16:6379> EXISTS pages
(integer) 0
10.0.0.16:6379> DECRBY pages 10
(integer) -10

2.2.4 GET

GET key

返回 key 所關聯的字符串值。

如果 key 不存在那麼返回特殊值 nil 

假如 key 儲存的值不是字符串類型,返回一個錯誤,因爲 GET 只能用於處理字符串值。

10.0.0.16:6379> GET db
(nil)
10.0.0.16:6379> SET db redis
OK
10.0.0.16:6379> GET db
"redis"
10.0.0.16:6379> DEL db
(integer) 1
10.0.0.16:6379> LPUSH db redis mongdb mysql
(integer) 3
10.0.0.16:6379> GET db
(error) WRONGTYPE Operation against a key holding the wrong kind of value

2.2.5 GETRANGE

GETRANGE key start end

返回 key 中字符串值的子字符串,字符串的截取範圍由 start  end 兩個偏移量決定(包括 start  end 在內)

負數偏移量表示從字符串最後開始計數, -1 表示最後一個字符, -2 表示倒數第二個,以此類推。

GETRANGE 通過保證子字符串的值域(range)不超過實際字符串的值域來處理超出範圍的值域請求。

10.0.0.16:6379> SET greeting "hello, my friend"
OK
10.0.0.16:6379> GETRANGE greeting 0 4
"hello"
10.0.0.16:6379> GETRANGE greeting -1 -5         #<==不支持迴繞操作
""
10.0.0.16:6379> GETRANGE greeting -5 -1
"riend"
10.0.0.16:6379> GETRANGE greeting 0 -1
"hello, my friend"

2.2.6 INCR

INCR key

 key 中儲存的數字值增一。

如果 key 不存在,那麼 key 的值會先被初始化爲 0 ,然後再執行 INCR 操作。

如果值包含錯誤的類型,或字符串類型的值不能表示爲數字,那麼返回一個錯誤。

本操作的值限制在 64 (bit)有符號數字表示之內。

10.0.0.16:6379> SET page_view 20
OK
10.0.0.16:6379> INCR page_view
(integer) 21
10.0.0.16:6379> INCR page_view
(integer) 22
10.0.0.16:6379> GET page_view
"22"

2.2.7 INCRBY

INCRBY key increment

 key 所儲存的值加上增量 increment 

如果 key 不存在,那麼 key 的值會先被初始化爲 0 ,然後再執行 INCRBY 命令。

如果值包含錯誤的類型,或字符串類型的值不能表示爲數字,那麼返回一個錯誤。

本操作的值限制在 64 (bit)有符號數字表示之內。

10.0.0.16:6379> SET rank 50
OK
10.0.0.16:6379> INCRBY rank 20
(integer) 70
10.0.0.16:6379> GET rank
"70"
10.0.0.16:6379> EXISTS counter
(integer) 0
10.0.0.16:6379> INCRBY counter 20
(integer) 20
10.0.0.16:6379> GET counter
"20"
10.0.0.16:6379> SET book "long long ago..."
OK
10.0.0.16:6379> INCRBY book 20
(error) ERR value is not an integer or out of range

2.2.8 MGET

MGET key [key ...]

返回所有(一個或多個)給定 key 的值。

如果給定的 key 裏面,有某個 key 不存在,那麼這個 key 返回特殊值 nil 。因此,該命令永不失敗。

10.0.0.16:6379> SET redis redis.com
OK
10.0.0.16:6379> SET mongodb mongodb.org
OK
10.0.0.16:6379> MGET redis mongodb
1) "redis.com"
2) "mongodb.org"
10.0.0.16:6379> MGET redis mongodb mysql
1) "redis.com"
2) "mongodb.org"
3) (nil)

2.2.9 MSET

MSET key value [key value ...]

同時設置一個或多個 key-value 對。

如果某個給定 key 已經存在,那麼 MSET 會用新值覆蓋原來的舊值,如果這不是你所希望的效果,請考慮使用 MSETNX 命令:它只會在所有給定 key 都不存在的情況下進行設置操作。

MSET 是一個原子性(atomic)操作,所有給定 key 都會在同一時間內被設置,某些給定 key 被更新而另一些給定 key 沒有改變的情況,不可能發生。

10.0.0.16:6379> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
OK
10.0.0.16:6379> MGET date time weather
1) "2012.3.30"
2) "11:00 a.m."
3) "sunny"
10.0.0.16:6379> SET google "google.hk"
OK
10.0.0.16:6379> MSET google "google.com"
OK
10.0.0.16:6379> GET google
"google.com"

2.2.10 STRING

STRLEN key

返回 key 所儲存的字符串值的長度。

 key 儲存的不是字符串值時,返回一個錯誤。

10.0.0.16:6379> SET mykey "Hello World"
OK
10.0.0.16:6379> STRLEN mykey
(integer) 11
10.0.0.16:6379> STRLEN nonexisting
(integer) 0

2.3 針對Hash

命令

命令說明

HDEL

刪除哈希表 key 中的一個或多個指定域,不存在的域將被忽略

HEXISTS

查看哈希表 key 中,給定域 field 是否存在

HGET

返回哈希表 key 中給定域 field 的值

HGETALL

返回哈希表 key 中,所有的域和值。

HINCRBY

爲哈希表 key 中的域 field 的值加上增量 increment 

HKEYS

返回哈希表 key 中的所有域

HMGET

返回哈希表 key 中,一個或多個給定域的值

HMSET

同時將多個 field-value (-)對設置到哈希表 key 

HSET

將哈希表 key 中的域 field 的值設爲 value 

HSETNX

將哈希表 key 中的域 field 的值設置爲 value ,當且僅當域 field 不存在

HVALS

返回哈希表 key 中所有域的值

2.3.1 HDEL

HDEL key field [field ...]

刪除哈希表 key 中的一個或多個指定域,不存在的域將被忽略。

10.0.0.16:6379> HMSET abbr a apple b banana c cat d dog
OK
10.0.0.16:6379> HGETALL abbr
1) "a"
2) "apple"
3) "b"
4) "banana"
5) "c"
6) "cat"
7) "d"
8) "dog"
10.0.0.16:6379> HDEL abbr a
(integer) 1
10.0.0.16:6379> HDEL abbr not-exists-field
(integer) 0
10.0.0.16:6379> HDEL abbr b c
(integer) 2
10.0.0.16:6379> HGETALL abbr
1) "d"
2) "dog"

2.3.2 HEXISTS

HEXISTS key field

查看哈希表 key 中,給定域 field 是否存在。

10.0.0.16:6379> HEXISTS phone myphone
(integer) 0
10.0.0.16:6379> HSET phone myphone nokia-1110
(integer) 1
10.0.0.16:6379> HEXISTS phone myphone
(integer) 1

2.3.3 HGET

HGET key field

返回哈希表 key 中給定域 field 的值。

10.0.0.16:6379> HSET site redis redis.com
(integer) 1
10.0.0.16:6379> HGET site redis
"redis.com"
10.0.0.16:6379> HGET site mysql
(nil)

2.3.4 HGETALL

HGETALL key

返回哈希表 key 中,所有的域和值。

在返回值裏,緊跟每個域名(field name)之後是域的值(value),所以返回值的長度是哈希表大小的兩倍。

10.0.0.16:6379> HMSET people jacak "Jack Sparrow" gump "Forrest Gump"
OK
10.0.0.16:6379> HGETALL people
1) "jacak"
2) "Jack Sparrow"
3) "gump"
4) "Forrest Gump"

2.3.5 HINCRBY

HINCRBY key field increment

爲哈希表 key 中的域 field 的值加上增量 increment 

增量也可以爲負數,相當於對給定域進行減法操作。

如果 key 不存在,一個新的哈希表被創建並執行 HINCRBY 命令。

如果域 field 不存在,那麼在執行命令前,域的值被初始化爲 0 

對一個儲存字符串值的域 field 執行 HINCRBY 命令將造成一個錯誤。

本操作的值被限制在 64 (bit)有符號數字表示之內。

# increment 爲正數
redis> HEXISTS counter page_view    # 對空域進行設置
(integer) 0
redis> HINCRBY counter page_view 200
(integer) 200
redis> HGET counter page_view
"200"
# increment 爲負數
redis> HGET counter page_view
"200"
redis> HINCRBY counter page_view -50
(integer) 150
redis> HGET counter page_view
"150"
# 嘗試對字符串值的域執行HINCRBY命令
redis> HSET myhash string hello,world       # 設定一個字符串值
(integer) 1
redis> HGET myhash string
"hello,world"
redis> HINCRBY myhash string 1              # 命令執行失敗,錯誤。
(error) ERR hash value is not an integer
redis> HGET myhash string                   # 原值不變
"hello,world"

2.3.6 HKEYS

HKEYS key

返回哈希表 key 中的所有域。

# 哈希表非空
redis> HMSET website google www.google.com yahoo www.yahoo.com
OK
redis> HKEYS website
1) "google"
2) "yahoo"
 
# 空哈希表/key不存在
redis> EXISTS fake_key
(integer) 0
redis> HKEYS fake_key
(empty list or set)

2.3.7 HMGET

HMGET key field [field ...]

返回哈希表 key 中,一個或多個給定域的值。

如果給定的域不存在於哈希表,那麼返回一個 nil 值。

因爲不存在的 key 被當作一個空哈希表來處理,所以對一個不存在的 key 進行 HMGET 操作將返回一個只帶有 nil 值的表。

redis> HMSET pet dog "doudou" cat "nounou"    # 一次設置多個域
OK
 
redis> HMGET pet dog cat fake_pet             # 返回值的順序和傳入參數的順序一樣
1) "doudou"
2) "nounou"
3) (nil)                                      # 不存在的域返回nil值

2.3.8 HMSET

HMSET key field value [field value ...]

同時將多個 field-value (-)對設置到哈希表 key 中。

此命令會覆蓋哈希表中已存在的域。

如果 key 不存在,一個空哈希表被創建並執行 HMSET 操作。


redis> HMSET website google www.google.com yahoo www.yahoo.com
OK
 
redis> HGET website google
"www.google.com"
 
redis> HGET website yahoo
www.yahoo.com


2.3.9 HSET

HSET key field value

將哈希表 key 中的域 field 的值設爲 value 

如果 key 不存在,一個新的哈希表被創建並進行 HSET 操作。

如果域 field 已經存在於哈希表中,舊值將被覆蓋。

redis> HSET website google "www.g.cn"       # 設置一個新域
(integer) 1
 
redis> HSET website google "www.google.com" # 覆蓋一箇舊域
(integer) 0

2.3.10 HVALS

HVALS key

返回哈希表 key 中所有域的值。

# 非空哈希表
redis> HMSET website google www.google.com yahoo www.yahoo.com
OK
redis> HVALS website
1) "www.google.com"
2) "www.yahoo.com"
 
# 空哈希表/不存在的key
redis> EXISTS not_exists
(integer) 0
redis> HVALS not_exists
(empty list or set)

2.4 針對List

命令

命令說明

LINDEX

返回列表 key 中,下標爲 index 的元素

LINSERT

將值 value 插入到列表 key 當中,位於值 pivot 之前或之後

LPOP

移除並返回列表 key 的頭元素

LPUSH

將一個或多個值 value 插入到列表 key 的表頭

RPOP

移除並返回列表 key 的尾元素

RPUSH

將一個或多個值 value 插入到列表 key 的表尾(最右邊)

2.4.1 LINDEX

LINDEX key index

返回列表 key 中,下標爲 index 的元素。

下標(index)參數 start  stop 都以 0 爲底,也就是說,以 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。

你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。

如果 key 不是列表類型,返回一個錯誤。

redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3        # index不在 mylist 的區間範圍內
(nil)

2.4.2 LINSERT

LINSERT key BEFORE|AFTER pivot value

將值 value 插入到列表 key 當中,位於值 pivot 之前或之後。

 pivot 不存在於列表 key 時,不執行任何操作。

 key 不存在時, key 被視爲空列表,不執行任何操作。

如果 key 不是列表類型,返回一個錯誤。

redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
 
# 對一個非空列表插入,查找一個不存在的 pivot
redis> LINSERT mylist BEFORE "go" "let's"
(integer) -1                                    # 失敗
 
# 對一個空列表執行 LINSERT 命令
redis> EXISTS fake_list
(integer) 0
redis> LINSERT fake_list BEFORE "nono" "gogogog"
(integer) 0                                      # 失敗

2.4.3 LPOP

LPOP key

移除並返回列表 key 的頭元素。

redis> LLEN course
(integer) 0
redis> RPUSH course algorithm001
(integer) 1
redis> RPUSH course c++101
(integer) 2
redis> LPOP course  # 移除頭元素
"algorithm001"

2.4.4 LPUSH

LPUSH key value [value ...]

將一個或多個值 value 插入到列表 key 的表頭

如果有多個 value 值,那麼各個 value 值按從左到右的順序依次插入到表頭: 比如說,對空列表 mylist 執行命令 LPUSH mylist a b c ,列表的值將是 c b a ,這等同於原子性地執行 LPUSH mylist a  LPUSH mylist b  LPUSH mylist c 三個命令。

如果 key 不存在,一個空列表會被創建並執行 LPUSH 操作。

 key 存在但不是列表類型時,返回一個錯誤。

# 加入單個元素
redis> LPUSH languages python
(integer) 1
 
# 加入重複元素
redis> LPUSH languages python
(integer) 2
redis> LRANGE languages 0 -1     # 列表允許重複元素
1) "python"
2) "python"
 
# 加入多個元素
redis> LPUSH mylist a b c
(integer) 3
redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a"

2.4.5 RPOP

RPOP key

移除並返回列表 key 的尾元素。

redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> RPOP mylist           # 返回被彈出的元素
"three"
redis> LRANGE mylist 0 -1    # 列表剩下的元素
1) "one"
2) "two"

2.4.6 RPUSH

RPUSH key value [value ...]

將一個或多個值 value 插入到列表 key 的表尾(最右邊)

如果有多個 value 值,那麼各個 value 值按從左到右的順序依次插入到表尾:比如對一個空列表 mylist 執行 RPUSH mylist a b c ,得出的結果列表爲 a b c ,等同於執行命令 RPUSH mylist a  RPUSH mylist b  RPUSH mylist c 

如果 key 不存在,一個空列表會被創建並執行 RPUSH 操作。

 key 存在但不是列表類型時,返回一個錯誤。

# 添加單個元素
redis> RPUSH languages c
(integer) 1
# 添加重複元素
redis> RPUSH languages c
(integer) 2
redis> LRANGE languages 0 -1 # 列表允許重複元素
1) "c"
2) "c"
# 添加多個元素
redis> RPUSH mylist a b c
(integer) 3
redis> LRANGE mylist 0 -1
1) "a"
2) "b"
3) "c"

2.5 針對SET

命令

命令說明

SADD

將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略

SCARD

返回集合 key 的基數(集合中元素的數量)

SDIFF

返回一個集合的全部成員,該集合是所有給定集合之間的差集

SISMEMBER

判斷 member 元素是否集合 key 的成員

SMEMBERS

返回集合 key 中的所有成員

SMOVE

 member 元素從 source 集合移動到 destination 集合

SREM

移除集合中的一個或多個 member 元素,不存在的 member 元素會被忽略

SUNION

返回一個集合的全部成員,該集合是所有給定集合的並集



2.5.1 SADD

SADD key member [member ...]

將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。

假如 key 不存在,則創建一個只包含 member 元素作成員的集合。

 key 不是集合類型時,返回一個錯誤。

# 添加單個元素
redis> SADD bbs "discuz.net"
(integer) 1
 
# 添加重複元素
redis> SADD bbs "discuz.net"
(integer) 0
 
# 添加多個元素
redis> SADD bbs "tianya.cn" "groups.google.com"
(integer) 2
redis> SMEMBERS bbs
1) "discuz.net"
2) "groups.google.com"
3) "tianya.cn"

2.5.2 SCARD

SCARD key

返回集合 key 的基數(集合中元素的數量)

redis> SADD tool pc printer phone
(integer) 3
redis> SCARD tool   # 非空集合
(integer) 3
redis> DEL tool
(integer) 1
redis> SCARD tool   # 空集合
(integer) 0

2.5.3 SDIFF

SDIFF key [key ...]

返回一個集合的全部成員,該集合是所有給定集合之間的差集。

不存在的 key 被視爲空集。

redis> SMEMBERS peter's_movies
1) "bet man"
2) "start war"
3) "2012"
redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"
redis> SDIFF peter's_movies joe's_movies
1) "bet man"
2) "start war"

2.5.4 SISMEMBER

SISMEMBER key member

判斷 member 元素是否集合 key 的成員。

如果 member 元素是集合的成員,返回 1 

如果 member 元素不是集合的成員,或 key 不存在,返回 0 

redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"
redis> SISMEMBER joe's_movies "bet man"
(integer) 0
redis> SISMEMBER joe's_movies "Fast Five"
(integer) 1

2.5.5 SMEMBERS

SMEMBERS key

返回集合 key 中的所有成員。

不存在的 key 被視爲空集合。

# key 不存在或集合爲空
redis> EXISTS not_exists_key
(integer) 0
redis> SMEMBERS not_exists_key
(empty list or set)
 
# 非空集合
redis> SADD language Ruby Python Clojure
(integer) 3
redis> SMEMBERS language
1) "Python"
2) "Ruby"
3) "Clojure"

2.5.6 SMOVE

SMOVE source destination member

 member 元素從 source 集合移動到 destination 集合。

SMOVE 是原子性操作。

如果 source 集合不存在或不包含指定的 member 元素,則 SMOVE 命令不執行任何操作,僅返回 0 。否則, member 元素從 source 集合中被移除,並添加到 destination 集合中去。

 destination 集合已經包含 member 元素時, SMOVE 命令只是簡單地將 source 集合中的 member 元素刪除。

 source  destination 不是集合類型時,返回一個錯誤。

redis> SMEMBERS songs
1) "Billie Jean"
2) "Believe Me"
redis> SMEMBERS my_songs
(empty list or set)
redis> SMOVE songs my_songs "Believe Me"
(integer) 1
redis> SMEMBERS songs
1) "Billie Jean"
redis> SMEMBERS my_songs
1)  "Believe Me"

2.5.7 SREM

SREM key member [member ...]

移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。

 key 不是集合類型,返回一個錯誤。

# 測試數據
redis> SMEMBERS languages
1) "c"
2) "lisp"
3) "python"
4) "ruby"
# 移除單個元素
redis> SREM languages ruby
(integer) 1
 
# 移除不存在元素
redis> SREM languages non-exists-language
(integer) 0
 
# 移除多個元素
redis> SREM languages lisp python c
(integer) 3
redis> SMEMBERS languages
(empty list or set)

2.5.8 SUNION

SUNION key [key ...]

返回一個集合的全部成員,該集合是所有給定集合的並集。

不存在的 key 被視爲空集。

redis> SMEMBERS songs
1) "Billie Jean"
 
redis> SMEMBERS my_songs
1) "Believe Me"
 
redis> SUNION songs my_songs
1) "Billie Jean"
2) "Believe Me"

 詳細命令列表請查看官方幫助文檔:https://redis.io/commands


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