集合類型介紹
集合類型也是體現redis一個比較高價值的一個類型了。因為Redis的集合類型,所以我們可以很容易的在Redis中執行差集運算、交集運算、並集運算。
首先我們先介紹一下集合類型和清單類型的區別,其實學過物件導向的語言的同學應該都能猜到這些類型有什麼不同。
①集合類型和清單類型還是都能儲存2^32-1個字串
②集合類型是無序的,清單類型是有序的
③集合類型是唯一的,清單類型的值是不唯一的
下面我們一起來看一下文法。
1、增加刪除元素命令
sadd key member [member ...]srem key member [member ...]
sadd命令是用來向集合中增加元素的,當然根據前面的學習經驗,如果集合不存在,肯定是會自動建立的。但是這裡有點需要注意的是,如果元素已存在,那麼他會忽略而不會覆蓋。傳回值是成功加入元素的數量(忽略的元素不算)。
srem命令也是一樣,刪除元素,如果元素存在才會刪除成功,傳回值是成功刪除的元素的個數。
2、獲得集合中的所有元素
3、判斷元素是否在集合中
這個判斷操作的時間複雜度是O(1),無論集合中的元素有多少,這個命令始終都很很快的返回結果。存在返回1,不存在或沒有這個鍵的時候都返回0 。
4、集合間運算
sdiff key [key ...]sinter key [key ...]sunion key [key ...]
這三個命令才能使Redis大顯身手!
我們先準備點測試資料。
127.0.0.1:6379> sadd setA 1 2 3(integer) 3127.0.0.1:6379> sadd setB 2 3 4(integer) 3127.0.0.1:6379> sadd setC 3 4 5(integer) 3
127.0.0.1:6379> smembers setA 1) "1"2) "2"3) "3"127.0.0.1:6379>
(1)下面我們來介紹sdiff命令,這個命令實際上是差集運算。
集合A與集合B的差值運算表示為A-B,代表所有屬於A且不屬於B的元素構成的集合。這個命令同時支援傳入多個鍵,意思是A與B先做差集運算,然後結果再與C做差集運算。
127.0.0.1:6379> sdiff setA setB1) "1"127.0.0.1:6379> sdiff setB setC1) "2"127.0.0.1:6379> sdiff setA setB setC1) "1"
(2)接下來我們介紹sinter命令,這個命令用來對多個集合執行交集運算。集合A與集合B的交集表示為A∩B,即所有屬於A且屬於B的元素構成的集合。這個命令也同時支援傳入多個鍵,也是一樣,一步一步的做交集運算。
127.0.0.1:6379> sinter setA setB1) "2"2) "3"127.0.0.1:6379> sinter setA setB setC1) "3"
(3)最後我們介紹並集運算命令sunion。集合A與集合B的並集意思是既屬於A也屬於B的集合。同樣支援多個鍵傳入。
127.0.0.1:6379> sunion setA setB1) "1"2) "2"3) "3"4) "4"127.0.0.1:6379> sunion setA setB setC1) "1"2) "2"3) "3"4) "4"5) "5"
5、獲得集合中元素的個數
scard key127.0.0.1:6379> scard setA(integer) 3127.0.0.1:6379> scard setB(integer) 3
這條命令用來擷取集合中元素的個數。同樣集合不存在返回0 。
6、進行集合運算並將結果儲存
sdiffstore destination key [key ...]sinterstore destination key [key ...]sunionstore destination key [key ...]
這裡在所有的集合命令之後加了個store,很清楚就是儲存的意思了。destination就是目的地,也就是我們要儲存的鍵名。
例:
127.0.0.1:6379> sunionstore setAll setA setB setC(integer) 5127.0.0.1:6379> smembers setAll1) "1"2) "2"3) "3"4) "4"5) "5"
7、隨機獲得集合中的元素
這個命令用來隨機從集合中擷取一個元素,count參數用來一詞擷取多個元素,根據count的正負有不同的意義。
(1)當count為正數時,擷取count個不重複的元素,如果count大於所有值的個數,則返回全部元素。
(2)負值時,獲得|count|個元素,但有可能相同。
其實這個隨機並不是非常隨機,因為實際上redis的集合用的是散列的儲存結構,有興趣的讀者可以自己深入研究一下。
127.0.0.1:6379> srandmember setA 11) "1"127.0.0.1:6379> srandmember setA 21) "3"2) "2"127.0.0.1:6379> SRANDMEMBER setA 51) "1"2) "2"3) "3"127.0.0.1:6379> SRANDMEMBER setA -21) "3"2) "3"
8、從集合中彈出一個元素
之前我們也看過lpop與rpop,那是從列表中彈出,但是集合是無序的,所以spop是隨機彈出。 (彈出的元素被刪除,不在原來的集合中)
127.0.0.1:6379> spop setA 11) "2"127.0.0.1:6379> smembers setA1) "1"2) "3"
下面我們來舉例一個集合的具體應用。
在我們文章儲存的時候有個標籤tag,這個我們在關聯式資料庫的時候都需要使用中間表關聯。但是在Redis中,我們可以很方便的處理。
對每篇文章,我們使用一個post:文章ID:tags的鍵,類型為集合,儲存一篇文章所屬的tags,這樣本身關係型資料庫我們需要關聯文章表、標籤表、中間關係表三個表的複雜操作,在Redis中就很好處理了。
有時候我們還需要擷取指定標籤的所有文章,我們還需要增加一類的鍵,即tag:標籤名稱:posts的集合類型鍵,儲存每個標籤的文章ID集合,這樣我們每次想要擷取所有屬於某個標籤的文章列表的時候也不用像關聯式資料庫那樣關聯那麼多表,而是直接通過鍵就可以直接獲得了。
而在我們想要擷取比如同時屬於java和redis標籤的文章時,我們只需要對tag:java:posts和tag:redis:posts做交集運算就OK了,是不是很方便呢?
總結
以上就是這篇文章的全部內容了,希望能對大家的學習或者工作帶來一定的協助,如果有疑問大家可以留言交流。