Redis支持的數據結構及命令
第1章 支持數據結構類型
你也許已經知道Redis並不是簡單的key-value存儲,實際上他是一個數據結構服務器,支持不同類型的值。也就是說,你不必僅僅把字符串當作鍵所指向的值。下列這些數據類型都可作爲值類型:
數據類型 | 說明 |
Strings(字符串) | 二進制安全的字符串 |
Lists(列表) | 按插入順序排序的字符串元素的集合。他們基本上就是鏈表(linked lists)。 |
Sets(集合) | 不重複且無序的字符串元素的集合。 |
Sorted sets(有序集合) | 類似Sets,但是每個字符串元素都關聯到一個叫score浮動數值(floating number value)。裏面的元素總是通過score進行着排序,所以不同的是,它是可以檢索的一系列元素。(例如你可能會問:給我前面10個或者後面10個元素)。 |
Hashes(散列) | 由field和關聯的value組成的map。field和value都是字符串的 |
bitmaps | 通過特殊的命令,你可以將 String 值當作一系列 bits 處理:可以設置和清除單獨的 bits,數出所有設爲 1 的 bits 的數量,找到最前的被設爲 1 或 0 的 bit,等等。 |
hyperloglog | 估計一個 set 中元素數量的概率性的數據結構。 |
geospatial(地理空間) |
第2章 Redis常用命令
Redis命令十分豐富,包括的命令組有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14個redis命令組兩百多個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,查詢符合給定模式pattern的key。
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 出現時,有以下兩種可能:
1)key 可能存在於兩個實例
2)key 可能只存在於當前實例
唯一不可能發生的情況就是丟失 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所存儲的值的類型
返回值:
none(key不存在)
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