Redis中的set儲存型別

2021-07-29 20:05:50 字數 2473 閱讀 3058

在redis中,我們可以將set型別看作為沒有排序的字元集合,和list型別一樣,我們也可以在該型別的資料值上執行新增、刪除或判斷某一元素是否存在等操作。和list型別不同的是,set集合中不允許出現重複的元素,這一點和c++標準庫中的set容器是完全相同的。換句話說,如果多次新增相同元素,set中將僅保留該元素的乙份拷貝。和list型別相比,set型別在功能上還存在著乙個非常重要的特性,即在伺服器端完成多個sets之間的聚合計算操作,如unions、intersections和differences。由於這些操作均在服務端完成,因此效率極高,而且也節省了大量的網路io開銷。

set相關命令

(1)sadd key member [member …]:如果在插入的過程用,引數中有的成員在set中已經存在,該成員將被忽略,而其它成員仍將會被正常插入。如果執行該命令之前,該key並不存在,該命令將會建立乙個新的set,此後再將引數中的成員陸續插入。如果該key的value不是set型別,該命令將返回相關的錯誤資訊。該命令返回本次操作實際插入的成員數量。

(2)scard key:返回set中成員的數量,如果該key並不存在,返回0。

(3)sismember key member:判斷引數中指定成員是否已經存在於與key相關聯的set集合中。1表示已經存在,0表示不存在,或該key本身並不存在。

(4)smembers key:獲取與該key關聯的set中所有的成員。

(5)spop key:隨機的移除並返回set中的某一成員。 由於set中元素的布局不受外部控制,因此無法像list那樣確定哪個元素位於set的頭部或者尾部。返回移除的成員,如果該key並不存在,則返回nil。

(6)srem key member [member …]:從與key關聯的set中刪除引數中指定的成員,不存在的引數成員將被忽略,如果該key並不存在,將視為空set處理。該命令返回從set中實際移除的成員數量,如果沒有則返回0。

(7)srandmember key:和spop一樣,隨機的返回set中的乙個成員,不同的是該命令並不會刪除返回的成員。 返回隨機位置的成員,如果key不存在則返回nil。

(8)smove source destination member:原子性的將引數中的成員從source鍵移入到destination鍵所關聯的set中。因此在某一時刻,該成員或者出現在source中,或者出現在destination中。如果該成員在source中並不存在,該命令將不會再執行任何操作並返回0,否則,該成員將從source移入到destination。如果此時該成員已經在destination中存在,那麼該命令僅是將該成員從source中移出。如果和key關聯的value不是set,將返回相關的錯誤資訊。 1表示正常移動,0表示source中並不包含引數成員。

(9)sdiff key [key …]:返回引數中第乙個key所關聯的set和其後所有keys所關聯的sets中成員的差異。如果key不存在,則視為空set。 該命令返回差異結果成員的集合。

(10)sdiffstore destination key [key …]:該命令和sdiff命令在功能上完全相同,兩者之間唯一的差別是sdiff返回差異的結果成員,而該命令將差異成員儲存在destination關聯的set中。如果destination鍵已經存在,該操作將覆蓋它的成員。該命令返回差異成員的數量。

(11)sinter key [key …]:該命令將返回引數中所有keys關聯的sets中成員的交集。因此如果引數中任何乙個key關聯的set為空,或某一key不存在,那麼該命令的結果將為空集。該命令返回交集結果成員的集合。

(12)interstore destination key [key …]:該命令和sinter命令在功能上完全相同,兩者之間唯一的差別是sinter返回交集的結果成員,而該命令將交集成員儲存在destination關聯的set中。如果destination鍵已經存在,該操作將覆蓋它的成員。 返回交集成員的數量。

(13)sunion key [key …]:該命令將返回引數中所有keys關聯的sets中成員的並集。 該命令返回並集結果成員的集合。

(14)sunionstore destination key [key …]:該命令和sunion命令在功能上完全相同,兩者之間唯一的差別是sunion返回並集的結果成員,而該命令將並集成員儲存在destination關聯的set中。如果destination鍵已經存在,該操作將覆蓋它的成員。該命令返回返回並集成員的數量。

應用範圍:

1). 可以使用redis的set資料型別跟蹤一些唯一性資料,比如訪問某一部落格的唯一ip位址資訊。對於此場景,我們僅需在每次訪問該部落格時將訪問者的ip存入redis中,set資料型別會自動保證ip位址的唯一性。

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

redis中的set型別

redis中set型別是一種無序集合,在redis內部通過hashtable實現,set資料型別的優點是快速找到某個元素是否存在,用於記錄一些不能重複的值,例如 註冊的時候使用者名稱不能重複。set有如下命令 1 sadd key member 新增乙個字串型別的元素到key對應的set集合中。2 ...

Redis中List儲存型別

在redis中,list型別是按照插入的順序排序的字串鍊錶。和資料結構中的普通鍊錶一樣,可以在其頭部 left 和尾部 right 新增新的元素。在插入元素時,如果該鍵不存在,redis將為該鍵建立乙個新的鍊錶。如果鍊錶中所有的元素均被移除,那麼該鍵也會從資料庫中刪除。從元素的插入和刪除效率的角度來...

Redis資料型別 Set

redis的set是string的無序集合。set元素最大可以包含2的32次方個元素 關於set集合型別除了基本的新增刪除操作。其他有用的操作還包含集合的取並集,交集,差集。通過這些操作可以很容易的實現sns中的好友推薦和blog的tag功能。sadd 新增元素 127.0.0.1 6379 sad...