集合(set) 型別也是用來儲存多個的字串元素,但和列表型別不一樣的是,集合中不允許有重複的元素。(ps,如果重複了,乙個集合下如何區分那個元素是那個元素呢?);並且集合中的元素是無序的,不能通過索引下標獲取元素。乙個集合最多可以儲存2^32 -1 個元素。redis除了支援集合的增刪改查,同時還支援多個集合取交集,並集,差集。
1、新增元素,返回新增成功的個數
sadd key element [element ...]
2、刪除元素
srem key element [element ...]
3、計算元素個數
scard key
4、 判斷元素是否在集合中
sismember key element
5、隨機從集合返回指定個數元素 ,count 如果不寫,預設為1
srandmember key [count]
6、從集合隨機彈出元素
spop key [count]
注:srandmember和spop都是從集合隨機選出元素,不同的是,spop執行後會從集合中刪除該元素。而srandmember不會刪除該元素。
7、獲取所有元素,返回結果無序
smembers key
求多個集合交集
sinter key [key ...]
求多個集合並集
sunion key [key ...]
求多個集合差集
sdiff key [key ...]
將差集、並集、交集的結果儲存
sdiffstore destination key [key ...]
sunionstore destination key [key ...]
sinterstore destination key [key ...]
集合間的運算元素較多的情況下會比較耗時,所以redis提供了上面三個命令(原命令+store)將集合間的交集、並集、差集的結果儲存在destination 中,後面的key表示需要求交、並、差集的集合。
127.0.0.1:6379> sinterstore targerkey coll2 coll3
(integer) 25
集合型別的內部編碼有兩種
intset(整數集合) 當集合中的元素都是整數且元素個數小於st-max-intet-entries配置(預設512個),redis會選用intset來作為集合的內部實現,二減少記憶體的使用
hashtable(雜湊表) 當集合型別無法滿足intset的條件時,redis會使用hashtable作為集合的內部實現。
集合型別比較典型的使用場景就是標籤(tag),如乙個使用者可能對娛樂,體育比較感興趣,另乙個使用者對歷史,新聞比較感興趣,這些興趣點就是標籤。
注:使用者和標籤的關係維護應該在乙個事務內執行,防止部分命令失敗造成資料不一致。
常用場景組合:
sadd =tagging(標籤)
spop/srandmember =random item (生成隨機數,如**)
sadd + sinter = social graph (社交,求共同興趣愛好等)
集合 C 資料結構 集合 set
工作也不想做,部落格也不想寫qaq又是乙個難熬的下午 這個月的leetcode每日一題落下了好多,主要是動態規劃我真不會,看題解基本也想不明白,dp我的一生之敵 x x 這裡要介紹一下順序容器和關聯容器的區別。順序容器就是按照元素在容器中的位置,來進行儲存和訪問,例如vector deque lis...
redis 原理 資料結構 整數集合 五
集合鍵的底層 intset 實現之一,當乙個集合只包含數值,並且數值的元素並不多時,就會選擇使用整數集合作為底層實現,本地 0 sadd number 1 2 5 6 4本地 0 object encoding number intset 注 雖然contens型別為int 8但是真正儲存的儲存的型...
資料結構之集合Set
1 高層的資料結構,集合set和對映map,什麼是高層的資料結構呢,比如說是棧和佇列,這種資料結構更像是先定義好了使用介面,有了這些使用介面,包括資料結構本身所維持的一些性質,可以很方便的放入到一些應用中,但是底層實現可以多種多樣的,比如棧和佇列,底層實現既可以是動態資料,也可以是鍊錶。集合就是承載...