Redis學習手冊(Set數據類型)

1、概述:

在Redis中,咱們能夠將Set類型看做爲沒有排序的字符集合,和List類型同樣,咱們也能夠在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操做。須要說明的是,這些操做的時間複雜度爲O(1),即常量時間內完成次操做。Set可包含的最大元素數量是4294967295。和List類型不一樣的是,Set集合中不容許出現重複的元素,這一點和C++標準庫中的set容器是徹底相同的。換句話說,若是屢次添加相同元素,Set 中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在着一個很是重要的特性,即在服務器端完成多個Sets之間的聚合計算操做,如 unions、intersections和differences。因爲這些操做均在服務端完成,所以效率極高,並且也節省了大量的網絡IO開銷。redis

2、相關命令列表:

命令原型服務器

時間複雜度網絡

命令描述佈局

返回值測試

SADD key member [member ...]ui

O(N)spa

時間複雜度中的N表示操做的成員數量。若是在插入的過程用,參數中有的成員在 Set中已經存在,該成員將被忽略,而其它成員仍將會被正常插入。若是執行該命令以前,該Key並不存在,該命令將會建立一個新的Set,此後再將參數中 的成員陸續插入。若是該Key的Value不是Set類型,該命令將返回相關的錯誤信息。命令行

本次操做實際插入的成員數量。對象

SCARD key排序

O(1)

獲取Set中成員的數量。

返回Set中成員的數量,若是該Key並不存在,返回0。

SISMEMBER key member

O(1)

判斷參數中指定成員是否已經存在於與Key相關聯的Set集合中。

1表示已經存在,0表示不存在,或該Key自己並不存在。

SMEMBERS key

O(N)

時間複雜度中的N表示Set中已經存在的成員數量。獲取與該Key關聯的Set中全部的成員。

返回Set中全部的成員。

SPOP key 

O(1) 

隨機的移除並返回Set中的某一成員。 因爲Set中元素的佈局不受外部控制,所以沒法像List那樣肯定哪一個元素位於Set的頭部或者尾部。

返回移除的成員,若是該Key並不存在,則返回nil。

SREM key member [member ...]

O(N) 

時間複雜度中的N表示被刪除的成員數量。從與Key關聯的Set中刪除參數中指定的成員,不存在的參數成員將被忽略,若是該Key並不存在,將視爲空Set處理。

從Set中實際移除的成員數量,若是沒有則返回0。

SRANDMEMBER key 

O(1) 

和SPOP同樣,隨機的返回Set中的一個成員,不一樣的是該命令並不會刪除返回的成員。

返回隨機位置的成員,若是Key不存在則返回nil。

SMOVE source destination member

O(1) 

原子性的將參數中的成員從source鍵移入到destination鍵所關聯的 Set中。所以在某一時刻,該成員或者出如今source中,或者出如今destination中。若是該成員在source中並不存在,該命令將不會再 執行任何操做並返回0,不然,該成員將從source移入到destination。若是此時該成員已經在destination中存在,那麼該命令僅是 將該成員從source中移出。若是和Key關聯的Value不是Set,將返回相關的錯誤信息。

1表示正常移動,0表示source中並不包含參數成員。

SDIFF key [key ...]

O(N) 

時間複雜度中的N表示全部Sets中成員的總數量。返回參數中第一個Key所關聯的Set和其後全部Keys所關聯的Sets中成員的差別。若是Key不存在,則視爲空Set。

差別結果成員的集合。

SDIFFSTORE destination key [key ...] 

O(N) 

該命令和SDIFF命令在功能上徹底相同,二者之間惟一的差異是SDIFF返回差別的結果成員,而該命令將差別成員存儲在destination關聯的Set中。若是destination鍵已經存在,該操做將覆蓋它的成員。

返回差別成員的數量。

SINTER key [key ...] 

O(N*M) 

時間複雜度中的N表示最小Set中元素的數量,M則表示參數中Sets的數量。該命令將返回參數中全部Keys關聯的Sets中成員的交集。所以若是參數中任何一個Key關聯的Set爲空,或某一Key不存在,那麼該命令的結果將爲空集。

交集結果成員的集合。

SINTERSTORE destination key [key ...]

O(N*M) 

該命令和SINTER命令在功能上徹底相同,二者之間惟一的差異是SINTER返回交集的結果成員,而該命令將交集成員存儲在destination關聯的Set中。若是destination鍵已經存在,該操做將覆蓋它的成員。

返回交集成員的數量。 

SUNION key [key ...] 

O(N)

時間複雜度中的N表示全部Sets中成員的總數量。該命令將返回參數中全部Keys關聯的Sets中成員的並集。

並集結果成員的集合。

SUNIONSTORE destination key [key ...] 

O(N) 

該命令和SUNION命令在功能上徹底相同,二者之間惟一的差異是SUNION返回並集的結果成員,而該命令將並集成員存儲在destination關聯的Set中。若是destination鍵已經存在,該操做將覆蓋它的成員。 

返回並集成員的數量。

3、命令示例:

1. SADD/SMEMBERS/SCARD/SISMEMBER:
#
在Shell命令行下啓動Redis的客戶端程序。
/> redis-cli
#
插入測試數據,因爲該鍵myset以前並不存在,所以參數中的三個成員都被正常插入。
redis 127.0.0.1:6379>sadd myset a b c
(integer) 3
#
因爲參數中的a在myset中已經存在,所以本次操做僅僅插入了d和e兩個新成員。
redis 127.0.0.1:6379>sadd myset a d e
(integer) 2
#
判斷a是否已經存在,返回值爲1表示存在。
redis 127.0.0.1:6379>sismember myset a
(integer) 1
#
判斷f是否已經存在,返回值爲0表示不存在。
redis 127.0.0.1:6379>sismember myset f
(integer) 0
#
經過smembers命令查看插入的結果,從結果能夠,輸出的順序和插入順序無關。
redis 127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "a"
4) "b"
5) "e"
#
獲取Set集合中元素的數量。
redis 127.0.0.1:6379>scard myset
(integer) 5

2. SPOP/SREM/SRANDMEMBER/SMOVE:
#
刪除該鍵,便於後面的測試。
redis 127.0.0.1:6379>del myset
(integer) 1
#
爲後面的示例準備測試數據。
redis 127.0.0.1:6379>sadd myset a b c d
(integer) 4
#
查看Set中成員的位置。
redis 127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "a"
4) "b"
#
從結果能夠看出,該命令確實是隨機的返回了某一成員。
redis 127.0.0.1:6379>srandmember myset
"c"
#Set
中尾部的成員b被移出並返回,事實上b並非以前插入的第一個或最後一個成員。
redis 127.0.0.1:6379>spop myset
"b"
#
查看移出後Set的成員信息。
redis 127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "a"
#
從Set中移出a、d和f三個成員,其中f並不存在,所以只有a和d兩個成員被移出,返回爲2。
redis 127.0.0.1:6379>srem myset a d f
(integer) 2
#
查看移出後的輸出結果。
redis 127.0.0.1:6379>smembers myset
1) "c"
#
爲後面的smove命令準備數據。
redis 127.0.0.1:6379>sadd myset a b
(integer) 2
redis 127.0.0.1:6379>sadd myset2 c d
(integer) 2
#
將a從myset移到myset2,從結果能夠看出移動成功。
redis 127.0.0.1:6379>smove myset myset2 a
(integer) 1
#
再次將a從myset移到myset2,因爲此時a已經不是myset的成員了,所以移動失敗並返回0。
redis 127.0.0.1:6379>smove myset myset2 a
(integer) 0
#
分別查看myset和myset2的成員,確認移動是否真的成功。
redis 127.0.0.1:6379>smembers myset
1) "b"
redis 127.0.0.1:6379> smembers myset2
1) "c"
2) "d"
3) "a"

3. SDIFF/SDIFFSTORE/SINTER/SINTERSTORE:
#
爲後面的命令準備測試數據。
redis 127.0.0.1:6379>sadd myset a b c d
(integer) 4
redis 127.0.0.1:6379> sadd myset2 c
(integer) 1
redis 127.0.0.1:6379>sadd myset3 a c e
(integer) 3
#myset
和myset2相比,a、b和d三個成員是二者之間的差別成員。再用這個結果繼續和myset3進行差別比較,b和d是myset3不存在的成員。
redis 127.0.0.1:6379>sdiff myset myset2 myset3
1) "d"
2) "b"
#
將3個集合的差別成員存在在diffkey關聯的Set中,並返回插入的成員數量。
redis 127.0.0.1:6379>sdiffstore diffkey myset myset2 myset3
(integer) 2
#
查看一下sdiffstore的操做結果。
redis 127.0.0.1:6379>smembers diffkey
1) "d"
2) "b"
#
從以前準備的數據就能夠看出,這三個Set的成員交集只有c。
redis 127.0.0.1:6379>sinter myset myset2 myset3
1) "c"
#
將3個集合中的交集成員存儲到與interkey關聯的Set中,並返回交集成員的數量。
redis 127.0.0.1:6379> sinterstore interkey myset myset2 myset3
(integer) 1
#
查看一下sinterstore的操做結果。
redis 127.0.0.1:6379>smembers interkey
1) "c"
#
獲取3個集合中的成員的並集。
redis 127.0.0.1:6379>sunion myset myset2 myset3
1) "b"
2) "c"
3) "d"
4) "e"
5) "a"
#
將3個集合中成員的並集存儲到unionkey關聯的set中,並返回並集成員的數量。
redis 127.0.0.1:6379>sunionstore unionkey myset myset2 myset3
(integer) 5
#
查看一下suiionstore的操做結果。
redis 127.0.0.1:6379>smembers unionkey
1) "b"
2) "c"
3) "d"
4) "e"
5) "a"

4、應用範圍:

1). 可使用Redis的Set數據類型跟蹤一些惟一性數據,好比訪問某一博客的惟一IP地址信息。對於此場景,咱們僅需在每次訪問該博客時將訪問者的IP存入Redis中,Set數據類型會自動保證IP地址的惟一性。

2). 充分利用Set類型的服務端聚合操做方便、高效的特性,能夠用於維護數據對象之間的關聯關係。好比全部購買某一電子設備的客戶ID被存儲在一個指定的 Set中,而購買另一種電子產品的客戶ID被存儲在另一個Set中,若是此時咱們想獲取有哪些客戶同時購買了這兩種商品時,Set的 intersections命令就能夠充分發揮它的方便和效率的優點了。

更多精彩內容請關注:http://www.crxy.cn

掃一掃超人學院二維碼,精彩內容不斷:

相關文章
相關標籤/搜索