Redis 可以理解為一個大號的 Map,其中所有的資料都採用 key:value 的形式維護,在 Redis 中,一個 key 總是對應一個 value。其中 key 永遠是字串,而一般提到 Redis 的資料型別,指的是其儲存的 value 的資料型別。下面介紹 Redis 常見的資料型別,並簡單介紹常見的相關指令。
string
string 是最基本的資料型別,其他幾個資料型別底層也是通過 string 來實現的。
flowchart LR
subgraph values
value-one
value-two
end
subgraph keys
key:one --> value-one
key:two --> value-two
end
string 有以下幾個特點:
- string 型別用 nil 表示不存在的值,類似於程式語言中的 null。
- string 型別可儲存的最大長度為 512M。
- Redis 中沒有專門的數字型別,當一個 string 中存放的資料全部為數字、且該數字的範圍在 64位長整型範圍中時,Redis 可以將其當作數字進行操作。
基本操作
- 新增/修改資料:
set key value
,當 key 已存在時會更新其對應的值,返回 OK 表示執行成功,其他很多命令執行成功時也會返回 OK,不再贅述。 - 獲取資料:
get key
,當 key 不存在時返回 nil。 - 新增/修改一個或多個資料:
mset key value [key value ...]
。[key value ...]
表示該命令的引數可以是任意數量的 key、value 對,這種寫法與 Redis 官方文件相同,本文也多次使用這種方式。 - 獲取一個或多個資料:
mget key [key ...]
,返回的順序與引數指定的順序相同,如果引數中傳入了不存在的 key,返回結果中對應位置也會有一個 nil。 - 刪除一個或多個:
del key [key ...]
,與 MySQL 類似,返回結果是一個 Integer,表示改動的記錄數量,其他很多命令執行成功也會返回 OK,不再贅述。 - 獲取字串長度:
strlen key
。 - 追加資訊到原資料後:
append key value
,追加完成後返回新的字串長度。
擴充操作
數字的自增自減
- 自增一
incr key
,如果 key 對應的值不是純數字字串、或自增後會超過64位長整型範圍,該指令會報錯。 - 自增指定的整數
incrby key increment
,increment 自增係數如果是負數也可以實現自減的操作。 - 自增指定的浮點數
incrbyfloat key increment
- 自減一
decr key
- 自減指定的整數
decrby key decrement
- 沒有自減指定的浮點數命令
hash
雜湊表 hash 用於分組儲存資料,可類比程式語言中的雜湊資料結構,一個 key 對應一整個雜湊表,雜湊表中可以有多個欄位 field 和欄位的對應值 value,欄位名和欄位值都是字串,受 string 型別特點的約束。
flowchart LR
subgraph values
subgraph hash
field-one --> value-one
field-two --> value-two
end
end
subgraph keys
subgraph key
end
end
key --> hash
雜湊結構有以下幾個特點:
- 在一個雜湊表中,欄位不可重複,欄位值可以重複。
- 仍保有雜湊表的普遍特點,例如查詢效率高等。
- 每個雜湊表可以儲存 232 - 1個鍵值對。
基本操作
- 新增/修改雜湊表中欄位和對應的值:
hset key field value [field value ...]
。此外還有功能類似的hmset
命令,在 Redis 官方文件中被標記為已廢棄。 - 獲取雜湊表中某個欄位的值:
hget key field
- 獲取雜湊表中所有欄位的值:
hgetall key
- 獲取雜湊表中某些欄位的值:
hmget key field [feild ...]
- 獲取雜湊表中欄位的數量:
hlen key
- 檢查雜湊表中是否存在指定的欄位:
hexists key field
- 刪除雜湊表中某些資料:
hdel key field [field ...]
擴充套件操作
獨有操作
- 獲取一個雜湊表中所有欄位名:
hkeys key
- 獲取一個雜湊表中所有欄位值:
hvals key
數字的自增自減
- 將一個雜湊表中某個欄位的值自增指定的整數:
hincrby key field increment
,與前面出現的自增指令相同,increment 為負值時可以實現自減的功能。 - 將一個雜湊表中某個欄位的值自增指定的浮點數:
hincrbyfloat key field increment
list
列表 list 用於區分資料進出的順序,類似與程式語言中的雙端佇列,一個 key 對應一個列表,列表中存放的是元素 element,每個元素都是由 string 構成的,受 string 型別特點的約束。通過專門的、僅使用一部分命令可分別實現棧或佇列。
flowchart LR
subgraph values
subgraph element
elementone[[elementone]]
elementtwo[[elementtwo]]
elementthree[[elementthree]]
elementone<-->elementtwo<-->elementthree
end
end
subgraph keys
subgraph key
end
end
key-->element
- 列表中最多可以儲存 232 - 1個元素。
- 列表的相關命令較多,因為 Redis 為很多操作都提供了從左側和右側獲取兩種方式,分別以 l 和 r 開頭。
- 列表的元素可通過索引獲取,索引編號從 0 開始,-1 表示倒數第一個元素。後續命令中,index、start 和 stop 指索引的範圍。
基本操作
- 新增元素到列表中:左側新增
lpush key element [element ...]
和右側新增rpush ley element [element ...]
,由於列表結構的特殊性,這兩條命令不能通過覆蓋原始值的方式實現修改的功能。 - 獲取列表中指定位置的元素:
lindex key index
,這條命令沒有對應的rindex
命令,可以理解為此處的 l 是 list 的縮寫,而不是 left,下面兩條同理。 - 獲取列表的長度:
llen key
- 獲取列表指定範圍內的元素:
lrange key start stop
- 獲取並移除列表中的元素:
lpop key
和rpop key
擴充操作
- 從列表左側開始,刪除指定的元素,刪除一定數量後停止:
lrem key count element
。假如列表 mylist 中有幾個元素如下:a b c a b c a b c,執行命令lrem mylist 2 b
後,佇列中剩下的元素是 a c a c a b c。
set
集合 set 與雜湊結構類似,一個 key 對應一個集合,集合中存放的是成員 member,成員都是由 string 組成的,受 string 型別特點的約束。其底層實現方式就是在雜湊的欄位名上存放資料、而所有的欄位值都是 nil。
flowchart LR
subgraph values
subgraph set
member-one
member-two
end
end
subgraph keys
subgraph key
end
end
member-one --> nil
member-two --> nil
key --> set
集合結構有以下幾個特點:
- 仍保有 set 集合的普遍特點,例如不能存放重複值,高效的查詢等。
- 每個集合可以儲存 232 - 1個值對。
基本操作
- 新增成員:
sdd key member [member ...]
,當指定成員存在時,既不必更新也不會報錯。 - 獲取全部成員:
smembers key
- 刪除資料:
srem key member [member ...]
擴充操作
獨有操作
- 獲取集合成員總數:
scard key
- 判斷集合中是否包含指定成員:
sismember key member
,返回 1 表示存在、返回 0 表示不存在。
隨機獲取
- 隨機獲取集合中指定數量的成員:
srandmember key [count]
- 隨機獲取集合中指定數量的成員並移出集合:
spop key [count]
集合運算
- 求交集並返回結果:
sinter key [key ...]
- 求並集並返回結果:
sunion key [key ...]
- 求差集並返回結果:
sdiff key [key ...]
- 求交集並儲存結果到目標集合:
sinterstore destination key [key ...]
,destination 是目標集合的 key。 - 求並集並儲存結果到目標集合:
sunionstore destination key [key ...]
- 求差集並儲存結果到目標集合:
sdiffstore destination key [key ...]
- 將原集合中某個資料轉移到目標集合中:
smove source destination member
sorted_set
有序集合 sorted_set (也縮寫為 zset)是在 set 的基礎上,又增加了用於排序的分數 score。
flowchart LR
subgraph values
subgraph set
score-one
score-two
member-one
member-two
end
end
subgraph keys
subgraph key
end
end
score-one --- member-one --> nil
score-two --- member-two --> nil
key --> set
基礎操作
- 新增/修改成員和對應的分數:
zadd key score member [score member ...]
,當 member 已存在時,這條指令可以用於更新分數。 - 獲取集合的成員總數:
zcard key
- 獲取集合中指定成員對應的分數:
score key member
- 刪除集合中指定的成員:
zrem key member [member ...]
根據索引操作
- 獲取指定索引範圍內的成員,按分數升序排列:
zrange key start stop [WITHSORES]
,如果入參有 withscores 返回結果也會帶上成員對應的分數。 - 獲取指定索引範圍內的成員,按分數降序排列:
zrevrange key start stop [WITHSORES]
- 按索引刪除資料:
zremrangebyrank key start stop
根據分數操作
- 獲取指定分數範圍內的成員,按分數升序排列:
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
。操作分數時,預設是閉區間,可加上符號(
表示開區間。[LIMIT offset count]
是偏移量和計數的限制。 - 獲取指定分數範圍內的成員,按分數降序排列:
zrevrangebyscore key min max [WITHSCORES] [LIMIT offset count]
- 按分數刪除資料:
zremrangebyscore key min max
- 計算某個分數範圍內成員總數:
zcount key min max
- 返回集合中指定成員按分數升序排列後的排名:
zrank key member
- 返回集合中指定成員按分數降序排列後的排名:
zrevrank key member
擴充操作
數字的自增自減
- 將集合中指定成員的資料自增:
zincrby key increment member
集合運算
- 交集:
zinterstore destination numkeys key [key ...]
- 並集:
zunionstore destination numkeys key [key ...]