最新:Redis持久化——AOF日誌redis
集合類型 (Set) 是一個無序並惟一的鍵值集合。它的存儲順序不會按照插入的前後順序進行存儲。
集合類型和列表類型的區別以下:
一個集合最多能夠存儲232-1個元素。Redis除了支持集合內的增刪改查,同時還支持多個集合取交集、並集、差集,合理地使用好集合類型,能在實際開發中解決不少實際問題。
集合類型的內部編碼有兩種:
intset(整數集合):當集合中的元素都是整數且元素個數小於set-maxintset-entries配置(默認512個)時,Redis會選用intset來做爲集合的內部實現,從而減小內存的使用。
hashtable(哈希表):當集合類型沒法知足intset的條件時,Redis會使用hashtable做爲集合的內部實現。
有關intset和hashtable這兩種redis底層數據結構的具體實現能夠參考個人另外兩篇文章。
Redis列表對象經常使用命令以下表(點擊命令可查看命令詳細說明)。
命令 | 說明 | 時間複雜度 |
---|---|---|
SADD key member [member ...] | 添加一個或者多個元素到集合(set)裏 | O(N) |
SCARD key | 獲取集合裏面的元素數量 | O(1) |
SDIFF key [key ...] | 得到隊列不存在的元素 | O(N) |
SDIFFSTORE destination key [key ...] | 得到隊列不存在的元素,並存儲在一個關鍵的結果集 | O(N) |
SINTER key [key ...] | 得到兩個集合的交集 | O(N*M) |
SINTERSTORE destination key [key ...] | 得到兩個集合的交集,並存儲在一個關鍵的結果集 | O(N*M) |
SISMEMBER key member | 肯定一個給定的值是一個集合的成員 | O(1) |
SMEMBERS key | 獲取集合裏面的全部元素 | O(N) |
SMOVE source destination member | 移動集合裏面的一個元素到另外一個集合 | O(1) |
SPOP key [count] | 刪除並獲取一個集合裏面的元素 | O(1) |
SRANDMEMBER key [count] | 從集合裏面隨機獲取一個元素 | |
SREM key member [member ...] | 從集合裏刪除一個或多個元素 | O(N) |
SUNION key [key ...] | 添加多個set元素 | O(N) |
SUNIONSTORE destination key [key ...] | 合併set元素,並將結果存入新的set裏面 | O(N) |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代set裏面的元素 | O(1) |
經過上文,咱們能夠知道集合的主要幾個特性,無序、不可重複、支持並交差等操做。所以集合類型比較適合用來數據去重和保障數據的惟一性,還能夠用來統計多個集合的交集、錯集和並集等,當咱們存儲的數據是無序而且須要去重的狀況下,比較適合使用集合類型進行存儲。
集合類型比較典型的使用場景是標籤(tag)。
給用戶添加標籤。
sadd user:1:tags tag1 tag2 tag5 sadd user:2:tags tag2 tag3 tag5 ... sadd user:k:tags tag1 tag2 tag4 ...
給標籤添加用戶
sadd tag1:users user:1 user:3 sadd tag2:users user:1 user:2 user:3 ... sadd tagk:users user:1 user:2 ...
使用sinter命令,能夠來計算用戶共同感興趣的標籤
sinter user:1:tags user:2:tags
這種標籤系統在電商系統、社交系統、視頻網站,圖書網站,旅遊網站等都有着普遍的應用。例如一個用戶可能對娛樂、體育比較感興趣,另外一個用戶可能對歷史、新聞比較感興趣,這些興趣點就是標籤。有了這些數據就能夠獲得喜歡同一個標籤的人,以及用戶的共同喜愛的標籤,這些數據對於用戶體驗以及加強用戶黏度比較重要。例如一個社交系統能夠根據用戶的標籤進行好友的推薦,已經用戶感興趣的新聞的推薦等,一個電子商務的網站會對不一樣標籤的用戶作不一樣類型的推薦,好比對數碼產品比較感興趣的人,在各個頁面或者經過郵件的形式給他們推薦最新的數碼產品,一般會爲網站帶來更多的利益。
Redis集合的 SPOP(隨機移除並返回集合中一個或多個元素) 和 SRANDMEMBER(隨機返回集合中一個或多個元素) 命令能夠幫助咱們實現一個抽獎系統
若是容許重複中獎,可使用SRANDMEMBER 命令
//添加抽獎名單 127.0.0.1:6379> SADD lucky:1 Tom (integer) 1 127.0.0.1:6379> SADD lucky:1 Jerry (integer) 1 127.0.0.1:6379> SADD lucky:1 John (integer) 1 127.0.0.1:6379> SADD lucky:1 Marry (integer) 1 127.0.0.1:6379> SADD lucky:1 Sean (integer) 1 127.0.0.1:6379> SADD lucky:1 Lindy (integer) 1 127.0.0.1:6379> SADD lucky:1 Echo (integer) 1 //抽取三等獎3個 127.0.0.1:6379> SRANDMEMBER lucky:1 3 1) "John" 2) "Echo" 3) "Lindy" //抽取二等獎2個 127.0.0.1:6379> SRANDMEMBER lucky:1 2 1) "Sean" 2) "Lindy" //抽取一等獎1個 127.0.0.1:6379> SRANDMEMBER lucky:1 1 1) "Tom"
若是不容許重複中獎,可使用 SPOP 命令
//添加抽獎名單 127.0.0.1:6379> SADD lucky:1 Tom (integer) 1 127.0.0.1:6379> SADD lucky:1 Jerry (integer) 1 127.0.0.1:6379> SADD lucky:1 John (integer) 1 127.0.0.1:6379> SADD lucky:1 Marry (integer) 1 127.0.0.1:6379> SADD lucky:1 Sean (integer) 1 127.0.0.1:6379> SADD lucky:1 Lindy (integer) 1 127.0.0.1:6379> SADD lucky:1 Echo (integer) 1 //抽取三等獎3個 127.0.0.1:6379> SPOP lucky:1 3 1) "John" 2) "Echo" 3) "Lindy" //抽取二等獎2個 127.0.0.1:6379> SPOP lucky:1 2 1) "Sean" 2) "Marry" //抽取一等獎1個 127.0.0.1:6379> SPOP lucky:1 1 1) "Tom"
注意:
Redis 2.6版本開始SRANDMEMBER命令支持Count參數。
Redis 3.2版本開始SRANDMEMBER命令支持Count參數。
其他低版本一次只能獲取一個隨機元素。
本篇文章咱們總結了Redis 集合對象的內部實現、經常使用命令以及經常使用的一些場景,那麼你們在項目中對Redis集合對象的使用都有哪些場景呢,歡迎在評論區給我留言和分享,我會第一時間反饋!咱們共同窗習與進步!
《Redis設計與實現》
《Redis開發與運維》
《Redis官方文檔》
關注下方公衆號,回覆「Redis」,可得Redis相關學習資料