Redis教學(五):Set資料型

黄舟
發布: 2016-12-28 14:41:24
原創
1231 人瀏覽過

一、概述:

      在Redis中,我們可以將Set類型視為沒有排序的字元集合,和List類型一樣,我們也可以在該類型的資料值上執行新增、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間複雜度為O(1),即在常數時間內完成次操作。 Set可包含的最大元素數量是4294967295。
      和List類型不同的是,Set集合中不允許重複的元素,這一點和C++標準函式庫中的set容器是完全相同的。換句話說,如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在著一個非常重要的特性,即在伺服器端完成多個Sets之間的聚合計算操作,如unions、intersections和differences。由於這些操作都是在服務端完成,因此效率極高,也節省了大量的網路IO開銷。

二、相關指令列表:

SA 。如果在插入的過程用,參數中有的成員在Set中已經存在,該成員將被忽略,而其它成員仍將會被正常插入。如果執行該指令之前,該Key並不存在,該指令將會建立一個新的Set,此後再將參數中的成員陸續插入。如果該Key的Value不是Set類型,則該指令將傳回相關的錯誤訊息。 取得Set中成員的數量。 判斷參數中指定成員是否已存在於與Key相關聯的Set集合中。 時間複雜度中的N表示Set中已經存在的成員數量。取得與該Key關聯的Set中所有的成員。 隨機的移除並返回Set中的某一成員。 由於Set中元素的佈局不受外部控制,因此無法像List那樣確定哪個元素位於Set的頭部或尾部。 時間複雜度中的N表示被刪除的成員數量。從與Key關聯的Set中刪除參數中指定的成員,不存在的參數成員將被忽略,如果該Key並不存在,則視為空Set處理。 和SPOP一樣,隨機的返回Set中的一個成員,不同的是該命令並不會刪除返回的成員。 O(N*M) 時間複雜度中的N表示最小Set中元素的數量,M表示參數中Sets的數量。參數中任何一個Key關聯的Set為空,或某一Key不存在,那麼該指令的結果將為空集。 O(N*M) 該指令和SINTER指令在功能上完全相同,兩者之間唯一的差異是SINTER返回交集的結果成員,而該指令將交集成員儲存在destination關聯的Set中。鍵已經存在,該操作將覆蓋它的成員。成員的總數。
指令原型 時間複雜度 指令描述 回傳值
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中。
該指令和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"
登入後複製

四、應用範圍:


      1). 一些唯一可以使用Redis的Set資料類型來追蹤一些唯一性數據,例如存取某一部落格的唯一IP位址資訊。對於此場景,我們只需在每次造訪該部落格時將訪客的IP存入Redis中,Set資料類型會自動保證IP位址的唯一性。

      2). 充分利用Set類型的服務端聚合操作方便、有效率的特性,可用於維護資料物件之間的關聯關係。例如所有購買某一電子設備的客戶ID被儲存在一個指定的Set中,而購買另外一種電子產品的客戶ID被儲存在另一個Set中,如果此時我們想獲取有哪些客戶同時購買了這兩種商品時,Set的intersections指令就可以充分發揮它的方便和效率的優勢了。


 以上就是Redis教學(五):Set資料類型的內容,更多相關內容請關注PHP中文網(www.php.cn)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!