【Redis】資料型別介紹

2023-05-10 06:00:17

一、字元 string

Redis常用基本型別之一,存入Redis的所有key都是字元型別,常用於儲存Session資訊

字元型別
命令 含義 複雜度
set <key> <value> 設定 key value o (1)
get <key> 獲取 key 對應的 value 值 o (1)
del <key> 刪除 key o (1)
setnx <key> <value> key 不存在時建立 key o (1)
senxx <key> <value> key 存在時更新 key 值 o (1)
incr <key> 計數加操作 o (1)
decr <key> 計數減操作 o (1)
mset <key> <value> <key> <value> <key> <value> 批次設定 key value o (n)
mget <key> <key> <key> 批次獲取 key 對應的 value 值 o (n)

 

1、SET 建立字元型別的 key

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

可用版本: >= 1.0.0
時間複雜度: O(1)

將字串值 value 關聯到 key 。

如果 key 已經持有其他值, SET 就覆寫舊值, 無視型別。

當 SET 命令對一個帶有生存時間(TTL)的鍵進行設定之後, 該鍵原有的 TTL 將被清除。

可選引數

從 Redis 2.6.12 版本開始, SET 命令的行為可以通過一系列引數來修改:

  • EX seconds : 將鍵的過期時間設定為 seconds 秒。 執行 SET key value EX seconds 的效果等同於執行 SETEX key seconds value 。

  • PX milliseconds : 將鍵的過期時間設定為 milliseconds 毫秒。 執行 SET key value PX milliseconds 的效果等同於執行 PSETEX key milliseconds value 。

  • NX : 只在鍵不存在時, 才對鍵進行設定操作。 執行 SET key value NX 的效果等同於執行 SETNX key value 。

  • XX : 只在鍵已經存在時, 才對鍵進行設定操作。

 

127.0.0.1:6379> set key1 value1    #設定key value 值,無論是否存在都執行
OK
127.0.0.1:6379> type key1    #檢視key的資料型別
string
127.0.0.1:6379> set key2 value2 ex 3    #設定有效期為3s的key
OK
127.0.0.1:6379> set key3 value3 nx    #當key值不存在時建立key,相當於新增key
OK
127.0.0.1:6379> set key3 value3 nx
(nil)
127.0.0.1:6379> set key4 value4 xx  #當key值存在時對key的值進行更新,相當於更新key
(nil)
127.0.0.1:6379> set key4 value4 nx
OK
127.0.0.1:6379> set key4 value_4 xx
OK

 

 

2、GET 獲取一個key的內容

127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key3
"value3"

 

 

3、DEL 刪除一個和多個key

127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> del key1 key2
(integer) 2
127.0.0.1:6379> keys *
1) "key3"
127.0.0.1:6379> del key3
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> 

 

 

4、MSET 批次建立多個key

127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
OK

 

 

5、MGET 批次獲取多個key

127.0.0.1:6379> mget key1 key2 key3   #獲取多個key對應的value值
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379> keys ke*  #獲取ke開頭的所有key
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> keys *  #獲取所有key
1) "key3"
2) "key2"
3) "key1"

 

 

6、APPEND 追加內容

127.0.0.1:6379> append key1 " this is append"
(integer) 21
127.0.0.1:6379> get key1
"value1 this is append"
127.0.0.1:6379> 

 

 

7、GETSET 設定新值並返回舊值

127.0.0.1:6379> set key4 value4
OK
127.0.0.1:6379> getset key4 newdata4
"value4"
127.0.0.1:6379> get key4
"newdata4"

 

 

8、STRLEN 返回字串key對應的字元數

127.0.0.1:6379> set name janzen.qiu
OK
127.0.0.1:6379> get name
"janzen.qiu"
127.0.0.1:6379> strlen name
(integer) 10
127.0.0.1:6379> set addr 深圳市¸ 
OK
127.0.0.1:6379> get addr
"\xe6\xb7\xb1\xe5\x9c\xb3\xe5\xb8\x82\xb8\x82"
127.0.0.1:6379> strlen addr
(integer) 11

 

 

9、EXISTS 判斷key是否存在

127.0.0.1:6379> keys *
1) "key3"
2) "key4"
3) "name"
4) "addr"
5) "key2"
6) "key1"
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> exists key1 key2
(integer) 2

 

 

10、TTL 檢視key值過期時間

#TTL <key> 可以檢視key剩餘有效期單位為s,過期後的key會被自動刪除
#-1:表示永不過期,預設key的有效期都為永不過期
#-2:表示指定key不存在
127.0.0.1:6379> ttl keytemp (integer) 54 127.0.0.1:6379> ttl keytemp (integer) 52 127.0.0.1:6379> ttl keytemp (integer) 51 127.0.0.1:6379> ttl key1 (integer) -1 127.0.0.1:6379> ttl key (integer) -2 127.0.0.1:6379>

 

 

11、EXPIRE 重新設定key過期時間

127.0.0.1:6379> ttl keytemp
(integer) 196
127.0.0.1:6379> expire keytemp 800 #expire 命令結果為重置過期時間
(integer) 1
127.0.0.1:6379> ttl keytemp
(integer) 799
127.0.0.1:6379> ttl keytemp
(integer) 793
127.0.0.1:6379> expire keytemp 400
(integer) 1
127.0.0.1:6379> ttl keytemp
(integer) 399
127.0.0.1:6379> 

 

 

12、PERSIST 取消key值過期時間

127.0.0.1:6379> ttl keytemp
(integer) 333
127.0.0.1:6379> persist keytemp
(integer) 1
127.0.0.1:6379> ttl keytemp
(integer) -1

 

 

13、INCR 數值加計算

可利用INCR命令簇(INCR、INCRBY、INCRBYFLOAT)對可轉化為數值的字元型別進行加計算

INCR <key> :對可轉化為整形的字元進行遞增加1(效果等同於 INCRBY KEY 1),如果key不存在則初始化key為0後進行處理

INCRBY <key> <int>:對可轉化為整形的字元進行增加 int ,如果key不存在則初始化key為0後進行處理

INCRBYFLOAT <key> <float>:對可轉化為 整形或浮點數 的字元進行增加 float ,如果key不存在則初始化key為0後進行處理

127.0.0.1:6379> set num 100
OK
#遞增+1
127.0.0.1:6379> incr num (integer) 101 127.0.0.1:6379> incr num (integer) 102

#初始化key之後遞增+1 127.0.0.1:6379> incr num1 (integer) 1

#數值加計算 127.0.0.1:6379> incrby num 20 (integer) 122 127.0.0.1:6379> incrby num -15 (integer) 107

#初始化key後,進行加計算

127.0.0.1:6379> incrby num2 24 (integer) 24

#初始化key,進行浮點數加計算 127.0.0.1:6379> incrbyfloat numf 20.1 "20.1"

#浮點數加計算 127.0.0.1:6379> incrbyfloat numf 2.8 "22.9" 127.0.0.1:6379> incrbyfloat numf -3.4 "19.5" 127.0.0.1:6379> incrbyfloat numf -10 "9.5" 127.0.0.1:6379> incrbyfloat numf 20 "29.5"

 

 

 

14、DECR 數值減計算

可利用DECR命令簇(DECR、DECRBY)對可轉化為整形的字元型別進行加計算(不可處理浮點型內容)

DECR <key> :對可轉化為整形的字元進行遞減1(效果等同於 DECRBY KEY 1),如果key不存在則初始化key為0後進行處理

DECRBY <key> <int>:對可轉化為整形的字元減 int ,如果key不存在則初始化key為0後進行處理

#初始化key,進行遞減-1
127.0.0.1:6379> decr num3
(integer) -1

#遞減
-1 127.0.0.1:6379> decr num3 (integer) -2
#初始化key,進行減計算
127.0.0.1:6379> decrby num4 20 (integer) -20 #減計算 127.0.0.1:6379> decrby num3 10 (integer) -12 127.0.0.1:6379> decrby num3 -20 (integer) 8 #不可處理浮點型內容 127.0.0.1:6379> get numf "29.5" 127.0.0.1:6379> decr numf (error) ERR value is not an integer or out of range 127.0.0.1:6379> decrby numf 10 (error) ERR value is not an integer or out of range

 

 

  

二、列表 list

 

列表型別本質上是一個可雙向讀寫的的管道,頭部為左側,尾部為右側。一個列表最多可包含 2^32-1(4294967295)個元素,0為初始下標表示第一個元素,也可使用-1 表示最後一個元素的下標,元素值可以重複。

常用於紀錄檔和佇列場景。

列表特點:

  • 有序性
  • 元素可重複
  • 左右雙向可操作

 

1、LPUSH RPUSH 生成列表並插入資料

LPUSH key value [value …]

可用版本: >= 1.0.0

時間複雜度: O(1)

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

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

如果 key 不存在,一個空列表會被建立並執行 LPUSH 操作,當 key 存在但不是列表型別時,返回一個錯誤。

LPUSHX key value

可用版本: >= 2.2.0

時間複雜度: O(1)

將值 value 插入到列表 key 的表頭,當且僅當 key 存在並且是一個列表。

和 LPUSH key value [value …] 命令相反,當 key 不存在時, LPUSHX 命令什麼也不做。

RPUSH key value [value …]

可用版本: >= 1.0.0
時間複雜度: O(1)
將一個或多個值 value 插入到列表 key 的表尾(最右邊)。
如果有多個 value 值,那麼各個 value 值按從左到右的順序依次插入到表尾:比如對一個空列表 mylist 執行 RPUSH mylist c ,得出的結果列表為 c ,等同於執行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
如果 key 不存在,一個空列表會被建立並執行 RPUSH 操作。當 key 存在但不是列表型別時,返回一個錯誤。

RPUSHX key value

可用版本: >= 2.2.0
時間複雜度: O(1)
將值 value 插入到列表 key 的表尾,當且僅當 key 存在並且是一個列表。
和 RPUSH key value [value …] 命令相反,當 key 不存在時, RPUSHX 命令什麼也不做。
127.0.0.1:6379> lpush list1 a b c d e
(integer) 5
127.0.0.1:6379> rpush list2 a b c d e
(integer) 5

 

 

2、LPUSH RPUSH 向列表追加資料

127.0.0.1:6379> lpush list1 f
(integer) 6

#從右邊新增元素,其餘元素將向左移動 127.0.0.1:6379> rpush list2 f (integer) 6

 

 

3、獲取列表長度

LLEN key

可用版本: >= 1.0.0
時間複雜度: O(1)

返回列表 key 的長度。

如果 key 不存在,則 key 被解釋為一個空列表,返回 0 .

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

127.0.0.1:6379> llen list1
(integer) 6
127.0.0.1:6379> llen list2
(integer) 6

 

 

4、獲取列表指定位置資料

LRANGE key start stop

可用版本: >= 1.0.0
時間複雜度: O(S+N), S 為偏移量 start , N 為指定區間內元素的數量。

返回列表 key 中指定區間內的元素,區間以偏移量 start 和 stop 指定。

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

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

LINDEX key index

可用版本: >= 1.0.0
時間複雜度:O(N), N 為到達下標 index 過程中經過的元素數量。因此,對列表的頭元素和尾元素執行 LINDEX 命令,複雜度為O(1)。

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

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

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

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


127.0.0.1:6379> rpush list a b c d e
(integer) 5

#檢視單個指定位置的元素 127.0.0.1:6379> lindex list 0 "a" 127.0.0.1:6379> lindex list 1 "b" 127.0.0.1:6379> lindex list 2 "c" 127.0.0.1:6379> lindex list 3 "d" 127.0.0.1:6379> lindex list 4 "e"
#檢視指定範圍的元素 127.0.0.1:6379> lrange list 0 4 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 127.0.0.1:6379> lrange list 2 4 1) "c" 2) "d" 3) "e" 127.0.0.1:6379> lrange list 0 -1  #未知列表長度時,檢視所有元素 1) "a" 2) "b" 3) "c" 4) "d" 5) "e"
#起始下標位置必須位於結束下標左側 127.0.0.1:6379> lrange list -1 0 (empty list or set) 127.0.0.1:6379> lrange list -1 2 (empty list or set) 127.0.0.1:6379> lrange list 2 -5 (empty list or set)

 

 

5、修改列表指定索引值的元素

LSET key index value

可用版本: >= 1.0.0
時間複雜度:對頭元素或尾元素進行 LSET 操作,複雜度為 O(1)。其他情況下,為 O(N), N 為列表的長度。

將列表 key 下標為 index 的元素的值設定為 value 。

當 index 引數超出範圍,或對一個空列表( key 不存在)進行 LSET 時,返回一個錯誤。

127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lset list 2 n
OK
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "n"
4) "d"
5) "e"

 

 

6、移除列表資料

LPOP key

可用版本: >= 1.0.0

時間複雜度: O(1)

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

 

RPOP key

可用版本: >= 1.0.0

時間複雜度: O(1)

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

 

 

127.0.0.1:6379> rpush list a b c d e
(integer) 5

#刪除列表頭元素
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lpop list
"a"
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "d"
4) "e"

#刪除列表尾元素
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpop list
"e"
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"

 

 

LREM key count value

可用版本: >= 1.0.0
時間複雜度: O(N), N 為列表的長度。

根據引數 count 的值,移除列表中與引數 value 相等的元素。

count 的值可以是以下幾種:

  • count 0 : 從表頭開始向表尾搜尋,移除與 value 相等的元素,數量為 count 。

  

  • count 0 : 從表尾開始向表頭搜尋,移除與 value 相等的元素,數量為 count 的絕對值。

 

  

  • count 0 : 移除表中所有與 value 相等的值。

   

 

127.0.0.1:6379> lrange list 0 -1
 1) "a"
 2) "b"
 3) "c"
 4) "c"
 5) "a"
 6) "d"
 7) "e"
 8) "a"
 9) "b"
10) "a"
11) "e"
12) "c"
13) "c"
14) "c"
15) "b"
127.0.0.1:6379> lrem list -3 c  #從列表尾部開始刪除3個為 c 的元素
(integer) 3
127.0.0.1:6379> lrange list 0 -1
 1) "a"
 2) "b"
 3) "c"
 4) "c"
 5) "a"
 6) "d"
 7) "e"
 8) "a"
 9) "b"
10) "a"
11) "e"
12) "b"

127.0.0.1:6379> lrange list 0 -1
 1) "a"
 2) "b"
 3) "c"
 4) "c"
 5) "a"
 6) "d"
 7) "e"
 8) "a"
 9) "b"
10) "a"
11) "e"
12) "b"
127.0.0.1:6379> lrem list 2 a  #從列表頭部開始刪除2個為 a 的元素
(integer) 2
127.0.0.1:6379> lrange list 0 -1
 1) "b"
 2) "c"
 3) "c"
 4) "d"
 5) "e"
 6) "a"
 7) "b"
 8) "a"
 9) "e"
10) "b"

127.0.0.1:6379> lrange list 0 -1
 1) "b"
 2) "c"
 3) "c"
 4) "d"
 5) "e"
 6) "a"
 7) "b"
 8) "a"
 9) "e"
10) "b"
127.0.0.1:6379> lrem list 0 b  #刪除列表中所有為 b 的元素
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "c"
3) "d"
4) "e"
5) "a"
6) "a"
7) "e"

 

 

RPOPLPUSH source destination

可用版本: >= 1.2.0
時間複雜度: O(1)

命令 RPOPLPUSH 在一個原子時間內,執行以下兩個動作:

  • 將列表 source 中的最後一個元素(尾元素)彈出,並返回給使用者端。

  • 將 source 彈出的元素插入到列表 destination ,作為 destination 列表的的頭元素。

舉個例子,你有兩個列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,執行 RPOPLPUSH source destination 之後, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,並且元素 c 會被返回給使用者端。

如果 source 不存在,值 nil 被返回,並且不執行其他動作。

如果 source 和 destination 相同,則列表中的表尾元素被移動到表頭,並返回該元素,可以把這種特殊情況視作列表的旋轉(rotation)操作。

# source destination 為兩個不同的列表
127.0
.0.1:6379> lrange list1 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 127.0.0.1:6379> lrange list2 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 127.0.0.1:6379> rpoplpush list1 list2 "e" 127.0.0.1:6379> lrange list1 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 127.0.0.1:6379> lrange list2 0 -1 1) "e" 2) "a" 3) "b" 4) "c" 5) "d" 6) "e"
#source destination 為同一個列表 127.0.0.1:6379> rpush list1 a b c d e (integer) 5 127.0.0.1:6379> lrange list1 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 127.0.0.1:6379> rpoplpush list1 list1 "e" 127.0.0.1:6379> lrange list1 0 -1 1) "e" 2) "a" 3) "b" 4) "c" 5) "d"
#destination 列表不存在 127.0.0.1:6379> lrange list2 0 -1 1) "e" 2) "a" 3) "b" 4) "c" 5) "d" 6) "e" 127.0.0.1:6379> EXISTS list3 (integer) 0 127.0.0.1:6379> rpoplpush list2 list3 "e" 127.0.0.1:6379> lrange list2 0 -1 1) "e" 2) "a" 3) "b" 4) "c" 5) "d" 127.0.0.1:6379> lrange list3 0 -1 1) "e"

 

 

LTRIM key start stop

可用版本: >= 1.0.0
時間複雜度: O(N), N 為被移除的元素的數量。

對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。

舉個例子,執行命令 LTRIM list 2 ,表示只保留列表 list 的前三個元素,其餘元素全部刪除。

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

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

當 key 不是列表型別時,返回一個錯誤。

LTRIM 命令通常和 LPUSH key value [value …] 命令或 RPUSH key value [value …] 命令配合使用,舉個例子:

LPUSH log newest_log
LTRIM log 0 99

 這個例子模擬了一個紀錄檔程式,每次將最新紀錄檔 newest_log 放到 log 列表中,並且只保留最新的 100 項。注意當這樣使用 LTRIM 命令時,時間複雜度是O(1),因為平均情況下,每次只有一個元素被移除。

超出範圍的下標

超出範圍的下標值不會引起錯誤

如果 start 下標比列表的最大下標 end LLEN list 減去 1 )還要大,或者 start>stop , LTRIM 返回一個空列表(因為 LTRIM 已經將整個列表清空)。

如果 stop 下標比 end 下標還要大,Redis將 stop 的值設定為 end

127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ltrim list 1 3
OK
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "d"
#起始下標大於end
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "d"
4) "a"
5) "b"
6) "c"
7) "d"
8) "e"
127.0.0.1:6379> ltrim list 8 10
OK
127.0.0.1:6379> lrange list 0 -1
(empty list or set)

#終止下標大於起始下標
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ltrim list 3 0
OK
127.0.0.1:6379> lrange list 0 -1
(empty list or set)

 

 

使用DEL命令直接刪除key

127.0.0.1:6379> rpush list a b c d e
(integer) 5
127.0.0.1:6379> rpush list2 a b c d e
(integer) 5
127.0.0.1:6379> keys *
1) "list"
2) "list2"
127.0.0.1:6379> del list
(integer) 1
127.0.0.1:6379> del lisst2
(integer) 0
127.0.0.1:6379> 

 

 

7、指定元素前後插入新元素

LINSERT key BEFORE|AFTER pivot value

可用版本: >= 2.2.0
時間複雜度: O(N), N 為尋找 pivot 過程中經過的元素數量。

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

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

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

127.0.0.1:6379> rpush list a b c d e
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> linsert list before d test
(integer) 6
127.0.0.1:6379> LRANGE list 0 -1
1) "a"
2) "b"
3) "c"
4) "test"
5) "d"
6) "e"

127.0.0.1:6379> rpush list1 a b c d e
(integer) 5
127.0.0.1:6379> LRANGE list1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> linsert list after c test
(integer) 7
127.0.0.1:6379> LRANGE list1 0 -1
1) "a"
2) "b"
3) "c"
4) "test"
5) "d"
6) "e"
127.0.0.1:6379> 

 

 

三、集合 set

集合Set 是字元String的無序集合,集合中的成員具有唯一性,可以在兩個不同的集合中進行比較取值,常用於取值判斷、統計、交集等場景,

集合特點:

  • 無序性
  • 元素唯一性
  • 多集合處理

1、生成集合key

SADD key member [member …]

可用版本: >= 1.0.0
時間複雜度: O(N), N 是被新增的元素的數量。

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

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

127.0.0.1:6379> sadd set1 item1 item2 item3
(integer) 3
127.0.0.1:6379> type set1
set

  

2、集合追加元素

#追加集合內容是隻能追加集合中不存在的元素,已存在的元素將被忽略
127.0.0.1:6379> sadd set1 item3 item4 item5
(integer) 2

  

3、檢視集合元素

SMEMBERS key

可用版本: >= 1.0.0
時間複雜度: O(N), N 為集合的基數。

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

127.0.0.1:6379> smembers set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"

 

SISMEMBER key member

可用版本: >= 1.0.0
時間複雜度: O(1)

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

返回值

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

127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
#item2元素存在於列表set1
127.0.0.1:6379> sismember set1 item2 (integer) 1
#item9元素不存在與列表set1 127.0.0.1:6379> sismember set1 item9 (integer) 0

 

 

SRANDMEMBER key [count]

可用版本: >= 1.0.0
時間複雜度: 只提供 key 引數時為 O(1) 。如果提供了 count 引數,那麼為 O(N) ,N 為返回陣列的元素個數。

如果命令執行時,只提供了 key 引數,那麼返回集合中的一個隨機元素。

從 Redis 2.6 版本開始, SRANDMEMBER 命令接受可選的 count 引數:

  • 如果 count 為正數,且小於集合基數,那麼命令返回一個包含 count 個元素的陣列,陣列中的元素各不相同。如果 count 大於等於集合基數,那麼返回整個集合。

  • 如果 count 為負數,那麼命令返回一個陣列,陣列中的元素可能會重複出現多次,而陣列的長度為 count 的絕對值。

該操作和 SPOP key 相似,但 SPOP key 將隨機元素從集合中移除並返回,而 SRANDMEMBER 則僅僅返回隨機元素,而不對集合進行任何改動。

返回值

只提供 key 引數時,返回一個元素;如果集合為空,返回 nil 。 如果提供了 count 引數,那麼返回一個陣列;如果集合為空,返回空陣列。

127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"

#未輸入count值,預設隨機返回1個元素 127.0.0.1:6379> srandmember set1 "item4"
#count<0,返回3個元素,允許出現重複值 127.0.0.1:6379> srandmember set1 -3 1) "item4" 2) "item3" 3) "item4"
#count>0,返回3個元素,結果允許出現重複值 127.0.0.1:6379> srandmember set1 3 1) "item2" 2) "item5" 3) "item3"
#count 大於列表中的元素個數,返回當前列表 127.0.0.1:6379> srandmember set1 9 1) "item3" 2) "item2" 3) "item5" 4) "item1" 5) "item4"

 

 

SCARD key

可用版本: >= 1.0.0
時間複雜度: O(1)

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

返回值

集合的基數。 當 key 不存在時,返回 0 

127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
127.0.0.1:6379> smembers set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> scard set1
(integer) 5
127.0.0.1:6379> scard set2
(integer) 6

 

 

SSCAN cursor [MATCH pattern] [COUNT count]

可用版本: >= 2.8.0
時間複雜度:增量式迭代命令每次執行的複雜度為 O(1) , 對資料集進行一次完整迭代的複雜度為 O(N) , 其中 N 為資料集中的元素數量。

SCAN 命令及其相關的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用於增量地迭代(incrementally iterate)一集元素(a collection of elements)

127.0.0.1:6379> smembers set1
 1) "item5"
 2) "item1"
 3) "item231"
 4) "item132"
 5) "item3"
 6) "item13"
 7) "item4"
 8) "item2"
 9) "item121"
10) "item81"

#使用sscan篩選集合內元素
127.0.0.1:6379> sscan set1 0 match item??
1) "7"
2) 1) "item81"
   2) "item13"
127.0.0.1:6379> sscan set1 0 match item???
1) "7"
2) 1) "item231"
   2) "item132"
   3) "item121"
127.0.0.1:6379> sscan set1 0 match item??1
1) "7"
2) 1) "item231"
   2) "item121"
127.0.0.1:6379> sscan set1 0 match item*1
1) "7"
2) 1) "item231"
   2) "item121"
   3) "item81"
   4) "item1"

 

 

4、刪除集合中的元素

SREM key member [member …]

可用版本: >= 1.0.0
時間複雜度: O(N), N 為給定 member 元素的數量。

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

127.0.0.1:6379> smembers set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> srem set1 item1 item2
(integer) 2
127.0.0.1:6379> smembers set1
1) "item5"
2) "item3"
3) "item4"

#刪除不存在的元素,錯誤的元素會被忽略
127.0.0.1:6379> srem set1 item3 item6 item7
(integer) 1
127.0.0.1:6379> smembers set1
1) "item5"
2) "item4"

 

SPOP key

可用版本: >= 1.0.0
時間複雜度: O(1)

移除並返回集合中的一個隨機元素。

如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用 SRANDMEMBER key [count] 命令。

返回值

被移除的隨機元素。 當 key 不存在或 key 是空集時,返回 nil 。

 

127.0.0.1:6379> smembers set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> spop set2
"item4"
127.0.0.1:6379> smembers set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
127.0.0.1:6379> spop set2
"item6"
127.0.0.1:6379> smembers set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"

 

 

SMOVE source destination member

可用版本: >= 1.0.0
時間複雜度: O(1)

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

SMOVE 是原子性操作。

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

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

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

返回值

如果 member 元素被成功移除,返回 1 。 如果 member 元素不是 source 集合的成員,並且沒有任何操作對 destination 集合執行,那麼返回 0 

 

127.0.0.1:6379> smembers set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> smembers set2
1) "item4"
2) "item1"
3) "item9"
4) "item2"
5) "item7"
6) "item6"

#destination不存在時,自動建立set3集合,並將item5新增至set3
127.0.0.1:6379> smove set1 set3 item5
(integer) 1
127.0.0.1:6379> smembers set1
1) "item4"
2) "item1"
3) "item2"
4) "item3"
127.0.0.1:6379> smembers set3
1) "item5"

#item6不存在於source
127.0.0.1:6379> smove set1 set2 item6
(integer) 0
127.0.0.1:6379> smembers set1
1) "item1"
2) "item2"
3) "item5"
4) "item3"
5) "item4"
127.0.0.1:6379> smembers set2
1) "item4"
2) "item1"
3) "item9"
4) "item2"
5) "item7"
6) "item6"

#將item5從set1 移動至 set2
127.0.0.1:6379> smove set1 set2 item5
(integer) 1
127.0.0.1:6379> smembers set1
1) "item2"
2) "item1"
3) "item3"
4) "item4"
127.0.0.1:6379> smembers set2
1) "item1"
2) "item9"
3) "item2"
4) "item5"
5) "item7"
6) "item6"
7) "item4"

#item1 同時存在於set1 set2時,僅刪除 set1 中的 item1
127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
127.0.0.1:6379> smembers set2
1) "item9"
2) "item2"
3) "item1"
4) "item7"
5) "item6"
6) "item4"
127.0.0.1:6379> smove set1 set2 item1
(integer) 1
127.0.0.1:6379> smembers set1
1) "item2"
2) "item5"
3) "item3"
4) "item4"
127.0.0.1:6379> smembers set2
1) "item9"
2) "item2"
3) "item1"
4) "item7"
5) "item6"
6) "item4"

 

 

5、獲取集合交集

SINTER key [key …]

可用版本: >= 1.0.0
時間複雜度: O(N * M), N 為給定集合當中基數最小的集合, M 為給定集合的個數。

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

不存在的 key 被視為空集。

當給定集合當中有一個空集時,結果也為空集(根據集合運算定律)。

 

127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> sinter set1 set2
1) "item2"
2) "item4"
3) "item1"

 

 

SINTERSTORE destination key [key …]

可用版本: >= 1.0.0
時間複雜度: O(N * M), N 為給定集合當中基數最小的集合, M 為給定集合的個數。

這個命令類似於 SINTER key [key …] 命令,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。

如果 destination 集合已經存在,則將其覆蓋。

destination 可以是 key 本身。

 

 

127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"

#將set1 與 set2 的交集儲存到 sinter_set
127.0.0.1:6379> sinterstore sinter_set set1 set2
(integer) 3
127.0.0.1:6379> SMEMBERS sinter_set
1) "item2"
2) "item4"
3) "item1"

 

 

6、獲取集合並集

SUNION key [key …]

可用版本: >= 1.0.0
時間複雜度: O(N), N 是所有給定集合的成員數量之和。

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

不存在的 key 被視為空集。

 

127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> sunion set1 set2
1) "item9"
2) "item2"
3) "item5"
4) "item7"
5) "item1"
6) "item6"
7) "item3"
8) "item4"

 

 

SUNIONSTORE destination key [key …]

可用版本: >= 1.0.0
時間複雜度: O(N), N 是所有給定集合的成員數量之和。

這個命令類似於 SUNION key [key …] 命令,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。

如果 destination 已經存在,則將其覆蓋。

destination 可以是 key 本身

127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> sunionstore sunion_set set1 set2
(integer) 8
127.0.0.1:6379> SMEMBERS sunion_set
1) "item9"
2) "item2"
3) "item5"
4) "item7"
5) "item1"
6) "item6"
7) "item3"
8) "item4"

 

 

7、獲取集合差集

SDIFF key [key …]

可用版本: >= 1.0.0
時間複雜度: O(N), N 是所有給定集合的成員數量之和。

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

不存在的 key 被視為空集。

127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"
127.0.0.1:6379> SMEMBERS set1
1) "item3"
2) "item2"
3) "item4"
4) "item1"
5) "item5"
#set1 與 set2 的差值
127.0.0.1:6379> sdiff set1 set2
1) "item3"
2) "item5"
#set2 與 set1 的差值
127.0.0.1:6379> sdiff set2 set1
1) "item6"
2) "item9"
3) "item7"

 

SDIFFSTORE destination key [key …]

可用版本: >= 1.0.0
時間複雜度: O(N), N 是所有給定集合的成員數量之和。

這個命令的作用和 SDIFF key [key …] 類似,但它將結果儲存到 destination 集合,而不是簡單地返回結果集。

如果 destination 集合已經存在,則將其覆蓋。

destination 可以是 key 本身

 

127.0.0.1:6379> SMEMBERS set1
1) "item2"
2) "item5"
3) "item1"
4) "item3"
5) "item4"
127.0.0.1:6379> SMEMBERS set2
1) "item2"
2) "item9"
3) "item7"
4) "item1"
5) "item6"
6) "item4"

#set1 與 set2 的差值結果儲存到 sdiff_set1 127.0.0.1:6379> sdiffstore sdiff_set1 set1 set2 (integer) 2 127.0.0.1:6379> SMEMBERS sdiff_set1 1) "item3" 2) "item5"

#set2 與 set1 的差值結果儲存到 sdiff_set2 127.0.0.1:6379> sdiffstore sdiff_set2 set2 set1 (integer) 3 127.0.0.1:6379> SMEMBERS sdiff_set2 1) "item6" 2) "item9" 3) "item7"

 

 

四、有序集合 sorted set

 Sorted Set 有序集合也是一個由String字元型別元素組成的集合,且不允許內部元素value 重複出現。但是與Set集合不同的是,每個value元素都會關聯一個double(雙精度浮點型)型別的Score分散,Redis正是通過該Score分數為集合中的成員從小到大進行排序,有序集合成員value都是唯一的,但是Score分數允許出現重複情況。集合是通過雜湊表實現的,所以新增、刪除、查詢的複雜度都是O(1),集合中最大成員數為 2^32-1,每個集合可容納約40億個成員,常用於實現排行榜或者瀏覽量統計等場景。

有序集合特點:

  • 有序性
  • 元素唯一性
  • 每個元素通過score進行排序
  • value不可以重複,score可以重複

1、生成有序集合

ZADD key score member [[score member] [score member] …]

可用版本: >= 1.2.0
時間複雜度: O(M*log(N)), N 是有序集的基數, M 為成功新增的新成員的數量。

將一個或多個 member 元素及其 score 值加入到有序集 key 當中。

如果某個 member 已經是有序集的成員,那麼更新這個 member 的 score 值,並通過重新插入這個 member 元素,來保證該 member 在正確的位置上。

score 值可以是整數值或雙精度浮點數。

如果 key 不存在,則建立一個空的有序集並執行 ZADD 操作。

當 key 存在但不是有序集型別時,返回一個錯誤。

#新增一個元素到有序列表
127.0
.0.1:6379> zadd zset1 100 centos (integer) 1

#新增多個元素包含已存在的元素到有序列表 127.0.0.1:6379> zadd zset1 150 centos 160 ubuntu 170 alpine 900 windows10 (integer) 3

#新增多個新元素到有序列表 127.0.0.1:6379> zadd zset1 90 windows7 198 windows11 (integer) 2 127.0.0.1:6379> type zset1 zset

 

 

2、有序集合實現排行榜

ZRANGE key start stop [WITHSCORES]

可用版本: >= 1.2.0
時間複雜度: O(log(N)+M), N 為有序集的基數,而 M 為結果集的基數。

返回有序集 key 中,指定區間內的成員。

其中成員的位置按 score 值遞增(從小到大)來排序。

具有相同 score 值的成員按字典序(lexicographical order )來排列。

下標引數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。 你也可以使用負數下標,以 -1 表示最後一個成員, -2 表示倒數第二個成員,以此類推。

超出範圍的下標並不會引起錯誤。 比如說,當 start 的值比有序集的最大下標還要大,或是 start stop 時, ZRANGE 命令只是簡單地返回一個空列表。 另一方面,假如 stop 引數的值比有序集的最大下標還要大,那麼 Redis 將 stop 當作最大下標來處理。

可以通過使用 WITHSCORES 選項,來讓成員和它的 score 值一併返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。 使用者端庫可能會返回一些更復雜的資料型別,比如陣列、元組等。

#根據元素score值從小到大遞增排序,並展示所有元素
127.0
.0.1:6379> zrange zset1 0 -1 1) "windows7" 2) "centos" 3) "ubuntu" 4) "alpine" 5) "windows11" 6) "windows10" #根據元素score從小到大遞增排序,並展示從第4位元到最後一位的元素 127.0.0.1:6379> zrange zset1 3 -1 1) "alpine" 2) "windows11" 3) "windows10" #根據元素score從小到大遞減排序,並展示所有元素及score資訊 127.0.0.1:6379> zrange zset1 0 -1 withscores 1) "windows7" 2) "90" 3) "centos" 4) "150" 5) "ubuntu" 6) "160" 7) "alpine" 8) "170" 9) "windows11" 10) "198" 11) "windows10" 12) "900" #根據元素score從小到大遞增排序,並展示從第4位元到最後一位的元素及score資訊 127.0.0.1:6379> zrange zset1 3 -1 withscores 1) "alpine" 2) "170" 3) "windows11" 4) "198" 5) "windows10" 6) "900"

 

 

ZREVRANGE key start stop [WITHSCORES]

可用版本: >= 1.2.0
時間複雜度: O(log(N)+M), N 為有序集的基數,而 M 為結果集的基數。

返回有序集 key 中,指定區間內的成員。

其中成員的位置按 score 值遞減(從大到小)來排列。 具有相同 score 值的成員按字典序的逆序(reverse lexicographical order)排列。

#根據score從大到小遞減排序,並展示所有元素
127.0.0.1:6379> zrevrange zset1 0 -1
1) "windows10"
2) "windows11"
3) "alpine"
4) "ubuntu"
5) "centos"
6) "windows7"
#根據score從大到小遞減排序,並展示第2位到倒數第2位元素
127.0.0.1:6379> zrevrange zset1 1 -2
1) "windows11"
2) "alpine"
3) "ubuntu"
4) "centos"
#根據score從大到小遞減排序,並展示所有元素及score資訊
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
 1) "windows10"
 2) "900"
 3) "windows11"
 4) "198"
 5) "alpine"
 6) "170"
 7) "ubuntu"
 8) "160"
 9) "centos"
10) "150"
11) "windows7"
12) "90"
#根據score從大到小遞減排序,並展示第2位到倒數第2位元素及score資訊
127.0.0.1:6379> zrevrange zset1 1 -2 withscores
1) "windows11"
2) "198"
3) "alpine"
4) "170"
5) "ubuntu"
6) "160"
7) "centos"
8) "150"

 

 

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

可用版本: >= 1.0.5
時間複雜度: O(log(N)+M), N 為有序集的基數, M 為被結果集的基數。

返回有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。有序整合員按 score 值遞增(從小到大)次序排列。

具有相同 score 值的成員按字典序(lexicographical order)來排列(該屬性是有序集提供的,不需要額外的計算)。

可選的 LIMIT 引數指定返回結果的數量及區間(就像SQL中的 SELECT LIMIT offset, count ),注意當 offset 很大時,定位 offset 的操作可能需要遍歷整個有序集,此過程最壞複雜度為 O(N) 時間。

可選的 WITHSCORES 引數決定結果集是單單返回有序集的成員,還是將有序整合員及其 score 值一起返回。 該選項自 Redis 2.0 版本起可用。

區間及無限

min 和 max 可以是 -inf 和 +inf ,這樣一來,你就可以在不知道有序集的最低和最高 score 值的情況下,使用 ZRANGEBYSCORE 這類命令。

預設情況下,區間的取值使用閉區間 (小於等於或大於等於),你也可以通過給引數前增加 ( 符號來使用可選的開區間 (小於或大於)。

舉個例子:

ZRANGEBYSCORE zset (1 5

返回所有符合條件 score <= 5 的成員,而

ZRANGEBYSCORE zset (5 (10

則返回所有符合條件 score 10 的成員。

#將score分數在區間 150 >= score >=198 之間的元素按照從小到大遞增次序排列並展示
127.0.0.1:6379> zrangebyscore zset1 150 198
1) "centos"
2) "ubuntu"
3) "alpine"
4) "windows11"
#將score分數在區間 150 > score >198 之間的元素及score資訊按照從小到大遞增次序排列並展示
127.0.0.1:6379> zrangebyscore zset1 (150 (198 withscores
1) "ubuntu"
2) "160"
3) "alpine"
4) "170"

 

 

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

可用版本: >= 2.2.0
時間複雜度: O(log(N)+M), N 為有序集的基數, M 為結果集的基數。

返回有序集 key 中, score 值介於 max 和 min 之間(預設包括等於 max 或 min )的所有的成員。有序整合員按 score 值遞減(從大到小)的次序排列。

具有相同 score 值的成員按字典序的逆序(reverse lexicographical order )排列。

除了成員按 score 值遞減的次序排列這一點外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 命令一樣。

#展示所有score分數低於900的元素,並按照從大到小遞增排序
127.0.0.1:6379> zrevrangebyscore zset1 (900 -inf
1) "windows11"
2) "alpine"
3) "ubuntu"
4) "centos"
5) "windows7"
#展示所有score分數不低於170的元素及score資訊,按照從大到小遞增排序
127.0.0.1:6379> zrevrangebyscore zset1 +inf 170 withscores
1) "windows10"
2) "900"
3) "windows11"
4) "198"
5) "alpine"
6) "170"

 

 

3、獲取集合個數

ZCARD key

可用版本: >= 1.2.0
時間複雜度: O(1)

返回有序集 key 的基數。

127.0.0.1:6379> zrange zset1 0 -1
1) "windows7"
2) "centos"
3) "ubuntu"
4) "alpine"
5) "windows11"
6) "windows10"
127.0.0.1:6379> zcard zset1
(integer) 6

 

 

ZCOUNT key min max

可用版本: >= 2.0.0
時間複雜度: O(log(N)), N 為有序集的基數。

返回有序集 key 中, score 值在 min 和 max 之間(預設包括 score 值等於 min 或 max )的成員的數量。

127.0.0.1:6379> zrange zset1 0 -1 withscores
 1) "windows7"
 2) "90"
 3) "centos"
 4) "150"
 5) "ubuntu"
 6) "160"
 7) "alpine"
 8) "170"
 9) "windows11"
10) "198"
11) "windows10"
12) "900"
127.0.0.1:6379> zcount zset1 100 900
(integer) 5
127.0.0.1:6379> zcount zset1 -inf +inf
(integer) 6

 

 

4、返回某個數值的索引

ZRANK key member

可用版本: >= 2.0.0
時間複雜度: O(log(N))

返回有序集 key 中成員 member 的排名。其中有序整合員按 score 值遞增(從小到大)順序排列。

排名以 0 為底,也就是說, score 值最小的成員排名為 0

127.0.0.1:6379> zrank zset1 windows11
(integer) 4
127.0.0.1:6379> zrank zset1 centos
(integer) 1

 

 

ZREVRANK key member

可用版本: >= 2.0.0
時間複雜度: O(log(N))

返回有序集 key 中成員 member 的排名。其中有序整合員按 score 值遞減(從大到小)排序。

排名以 0 為底,也就是說, score 值最大的成員排名為 0 。

127.0.0.1:6379> zrevrank zset1 centos
(integer) 4
127.0.0.1:6379> zrevrank zset1 windows11
(integer) 1

 

 

5、獲取分數

ZSCORE key member

可用版本: >= 1.2.0
時間複雜度: O(1)

返回有序集 key 中,成員 member 的 score 值。

127.0.0.1:6379> zscore zset1 centos
"150"
127.0.0.1:6379> zscore zset1 windows10
"900"

 

 

6、增加指定元素的分數值

ZINCRBY key increment member

可用版本: >= 1.2.0
時間複雜度: O(log(N))

為有序集 key 的成員 member 的 score 值加上增量 increment 。

可以通過傳遞一個負數值 increment ,讓 score 減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。

當 key 不存在,或 member 不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member

 

#對指定元素的分數加
127.0.0.1:6379> zscore zset1 centos
"300"
127.0.0.1:6379> zincrby zset1 32 centos
"332"
127.0.0.1:6379> zscore zset1 centos
"332"

#對指定元素的分數減
127.0.0.1:6379> zscore zset1 centos
"332"
127.0.0.1:6379> zincrby zset1 -87 centos
"245"
127.0.0.1:6379> zscore zset1 centos
"245"

#對不存在的元素進行score分數增
127.0.0.1:6379> zrange zset1 0 -1
1) "windows7"
2) "ubuntu"
3) "alpine"
4) "windows11"
5) "centos"
6) "windows10"
127.0.0.1:6379> zincrby zset1 324 unix
"324"
127.0.0.1:6379> zrange zset1 0 -1
1) "windows7"
2) "ubuntu"
3) "alpine"
4) "windows11"
5) "centos"
6) "unix"
7) "windows10"

 

 

7、刪除元素

ZREM key member [member …]

可用版本: >= 1.2.0
時間複雜度: O(M*log(N)), N 為有序集的基數, M 為被成功移除的成員的數量。

移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。

127.0.0.1:6379> zrange zset1 0 -1 withscores
 1) "windows7"
 2) "90"
 3) "ubuntu"
 4) "160"
 5) "alpine"
 6) "170"
 7) "windows11"
 8) "198"
 9) "centos"
10) "245"
11) "unix"
12) "324"
13) "windows10"
14) "900"
127.0.0.1:6379> zrem zset1 unix ios
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1 withscores
 1) "windows7"
 2) "90"
 3) "ubuntu"
 4) "160"
 5) "alpine"
 6) "170"
 7) "windows11"
 8) "198"
 9) "centos"
10) "245"
11) "windows10"
12) "900"

 

 

ZREMRANGEBYRANK key start stop

可用版本: >= 2.0.0
時間複雜度: O(log(N)+M), N 為有序集的基數,而 M 為被移除成員的數量。

移除有序集 key 中,指定排名(rank)區間內的所有成員。

區間分別以下標引數 start 和 stop 指出,包含 start 和 stop 在內。

下標引數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。 你也可以使用負數下標,以 -1 表示最後一個成員, -2 表示倒數第二個成員,以此類推。

127.0.0.1:6379> zrange zset1 0 -1 withscores
 1) "windows7"
 2) "90"
 3) "ubuntu"
 4) "160"
 5) "alpine"
 6) "170"
 7) "windows11"
 8) "198"
 9) "centos"
10) "245"
11) "windows10"
12) "900"
127.0.0.1:6379> zremrangebyrank zset1 0 2
(integer) 3
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows11"
2) "198"
3) "centos"
4) "245"
5) "windows10"
6) "900"

 

 

ZREMRANGEBYSCORE key min max

可用版本: >= 1.2.0
時間複雜度: O(log(N)+M), N 為有序集的基數,而 M 為被移除成員的數量。

移除有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。

127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows11"
2) "198"
3) "centos"
4) "245"
5) "windows10"
6) "900"
127.0.0.1:6379> zremrangebyscore zset1 -inf 300
(integer) 2
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "windows10"
2) "900"

 

 

使用DEL刪除有序集合key

127.0.0.1:6379> del zset1
(integer) 1

 

 

五、雜湊 hash

 Hash雜湊是一個字元型別String(field)與 值(value)的對映表,Redis中的每個雜湊Hash可以儲存 2^32-1 鍵值對,類似於字典作用,特別適用於儲存物件場景。

1、生成hash key

HSET hash field value

可用版本: >= 2.0.0
時間複雜度: O(1)

將雜湊表 hash 中域 field 的值設定為 value 。

如果給定的雜湊表並不存在, 那麼一個新的雜湊表將被建立並執行 HSET 操作。

如果域 field 已經存在於雜湊表中, 那麼它的舊值將被新值 value 覆蓋。

127.0.0.1:6379> hset hash1 id 1 name janzen age 18 sex man number 159159
(integer) 5
127.0.0.1:6379> type hash1
hash

 

 

HSETNX hash field value

可用版本: >= 2.0.0
時間複雜度: O(1)

當且僅當域 field 尚未存在於雜湊表的情況下, 將它的值設定為 value 。

如果給定域已經存在於雜湊表當中, 那麼命令將放棄執行設定操作。

如果雜湊表 hash 不存在, 那麼一個新的雜湊表將被建立並執行 HSETNX 命令。

返回值

HSETNX 命令在設定成功時返回 1 , 在給定域已經存在而放棄執行設定操作時返回 0

 

127.0.0.1:6379> exists hash2
(integer) 0
#hash 不存在
127.0.0.1:6379> hsetnx hash2 id 2
(integer) 1

#同時修改多個引數
127.0.0.1:6379> hsetnx hash2 id 2 name qiu
(error) ERR wrong number of arguments for 'hsetnx' command
#field 不存在
127.0.0.1:6379> hsetnx hash2 name qiu (integer) 1 #field已存在 127.0.0.1:6379> hsetnx hash2 id 3 (integer) 0 127.0.0.1:6379>

 

 

2、獲取hash key 對應欄位的值

HGET hash field

可用版本: >= 2.0.0
時間複雜度: O(1)

返回雜湊表中給定域的值。

127.0.0.1:6379> hget hash1 id
"1"
127.0.0.1:6379> hget hash1 name
"janzen"
127.0.0.1:6379> hget hash1 age
"18"
127.0.0.1:6379> hget hash2 id
"2"
127.0.0.1:6379> hget hash2 name
"qiu"

 

 

3、刪除一個hash key的對應欄位

HDEL key field [field …]

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

127.0.0.1:6379> hdel hash2 id
(integer) 1
127.0.0.1:6379> hdel hash2 id name
(integer) 1

 

 

4、批次設定hash key 的多個filed和value

HMSET key field value [field value …]

同時將多個 field-value (域-值)對設定到雜湊表 key 中。

此命令會覆蓋雜湊表中已存在的域。

如果 key 不存在,一個空雜湊表被建立並執行 HMSET 操作

127.0.0.1:6379> hmset hash2 id 2 name qiu age 20 sex man number 970203
OK

 

 

5、獲取hash中指定欄位的值

HMGET key field [field …]

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

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

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

127.0.0.1:6379> hmget hash2 id name number
1) "2"
2) "qiu"
3) "970203"
127.0.0.1:6379> hmget hash1 id name number
1) "1"
2) "janzen"
3) "159159"

 

 

6、獲取hash中的所有欄位名field

HKEYS key

返回雜湊表 key 中的所有field

127.0.0.1:6379> hkeys hash1
1) "id"
2) "name"
3) "age"
4) "sex"
5) "number"
127.0.0.1:6379> hkeys hash2
1) "id"
2) "name"
3) "age"
4) "sex"
5) "number"

 

 

7、獲取指定hash所有的value

HVALS key

返回雜湊表 key 中所有field的值。

127.0.0.1:6379> hvals hash1
1) "1"
2) "janzen"
3) "18"
4) "man"
5) "159159"
127.0.0.1:6379> hvals hash2
1) "2"
2) "qiu"
3) "20"
4) "man"
5) "970203"

 

 

8、獲取指定hash的所有field和value值

HGETALL key

返回雜湊表 key 中,所有的域和值。

127.0.0.1:6379> hgetall hash1
 1) "id"
 2) "1"
 3) "name"
 4) "janzen"
 5) "age"
 6) "18"
 7) "sex"
 8) "man"
 9) "number"
10) "159159"
127.0.0.1:6379> hgetall hash2
 1) "id"
 2) "2"
 3) "name"
 4) "qiu"
 5) "age"
 6) "20"
 7) "sex"
 8) "man"
 9) "number"
10) "970203"

 

 

9、刪除hash

HDEL key field [field …]

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

127.0.0.1:6379> hgetall hash2
 1) "id"
 2) "2"
 3) "name"
 4) "qiu"
 5) "age"
 6) "20"
 7) "sex"
 8) "man"
 9) "number"
10) "970203"
127.0.0.1:6379> hdel hash2 id
(integer) 1
127.0.0.1:6379> hgetall hash2
1) "name"
2) "qiu"
3) "age"
4) "20"
5) "sex"
6) "man"
7) "number"
8) "970203"
127.0.0.1:6379> hdel hash2 name age addr
(integer) 2
127.0.0.1:6379> hgetall hash2
1) "sex"
2) "man"
3) "number"
4) "970203"

 

使用DEL刪除hash key

127.0.0.1:6379> hgetall hash2
1) "sex"
2) "man"
3) "number"
4) "970203"
127.0.0.1:6379> del hash2
(integer) 1
127.0.0.1:6379> hgetall hash2
(empty list or set)
127.0.0.1:6379> exists hash2
(integer) 0
127.0.0.1:6379>