一、概述:
在Redis中,我們可以將Set類型視為沒有排序的字元集合,和List類型一樣,我們也可以在該類型的資料值上執行新增、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間複雜度為O(1),即在常數時間內完成次操作。 Set可包含的最大元素數量是4294967295。
和List類型不同的是,Set集合中不允許重複的元素,這一點和C++標準函式庫中的set容器是完全相同的。換句話說,如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在著一個非常重要的特性,即在伺服器端完成多個Sets之間的聚合計算操作,如unions、intersections和differences。由於這些操作都是在服務端完成,因此效率極高,也節省了大量的網路IO開銷。
二、相關指令列表:
指令原型 | 時間複雜度 | 指令描述 | 回傳值 |
SADDkey member [member ...] | SADDkey member [member ...] | ||
本次操作實際插入的成員數量。 | SCARDkey | O(1) | |
回傳Set中成員的數量,如果該Key不存在,則回傳0。 | SISMEMBER key member | O(1) | |
1表示已經存在,0表示不存在,或該Key本身並不存在。 | SMEMBERS key | O(N) | |
返回Set中所有的成員。 | SPOPkey | O(1) | |
回傳移除的成員,如果該Key並不存在,則傳回nil。 | SREMkey member [member ...] | O(N) | |
從Set中實際移除的成員數量,如果沒有則回傳0。 | SRANDMEMBER key | O(1) | |
傳回隨機位置的成員,如果Key不存在則回傳nil。 | SMOVEsource destination member🎜🎜O(1)🎜🎜原子性的將參數中的成員從source鍵移入到destination鍵所關聯的Set中。因此在某一時刻,該成員或出現在source中,或出現在destination中。如果該成員在source中並不存在,則該命令將不會再執行任何操作並傳回0,否則,該成員將從source移入destination。如果此時該成員已經在destination中存在,那麼該指令僅是將該成員從source中移出。如果和Key關聯的Value不是Set,將會傳回相關的錯誤訊息。 | 1表示正常移動,0表示source中並不包含參數成員 | |
SDIFFkey [key ...] | O(N) | 時間複雜度中的N表示所有Sets中成員的總數。傳回參數中第一個Key所關聯的Set和其後所有Keys所關聯的Sets中成員的差異。如果Key不存在,則視為空Set。 | 差異結果成員的集合 |
SDIFFSTOREdestination key [key ...] | O(N | 該指令和SDIFF指令在功能上完全相同,兩者之間唯一的差異就是SDIFF成員,而該指令將差異成員儲存在destination關聯的Set中。 | O(N*M)時間複雜度中的N表示最小Set中元素的數量,M表示參數中Sets的數量。參數中任何一個Key關聯的Set為空,或某一Key不存在,那麼該指令的結果將為空集。 O(N*M) |
該指令和SUNION指令在功能上完全相同,兩者之間唯一的差異是SUNION回傳並集的結果成員,而該指令將並集成員儲存在destination關聯的Set中。操作將涵蓋它的成員。 三、指令範例: 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/SMOVEVE7. #删除该键,便于后面的测试。 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" 四、應用範圍:
|