一、概述
集合(Set)類型是用來保存多個字符串元素译断,但是與list類型不停,集合中不允許有重復元素堪唐,一個集合最對可以存儲2^32-1個元素淮菠,Redis除了支持集合內(nèi)的增刪改查荤堪,同時還支持多個集合的交并差集操作,合理地使用集合可以在實際開發(fā)中解決很多實際問題曙寡。
二寇荧、常用命令
1.集合內(nèi)操作
- 添加元素:sadd key element [element ...],返回結(jié)果為添加成功的元素個數(shù)户侥;
- 刪除元素:srem key element [element ...]峦嗤,返回結(jié)果為成功刪除的元素個數(shù);
- 計算元素個數(shù):scard key 替梨,該命令的實際復雜度為O(1)装黑,不會遍歷集合中所有元素,而是直接使用Redis的內(nèi)部變量糠睡;
- 判斷元素是否在集合中:sismember key element疚颊,存在則返回1信认,否則返回0嫁赏;
- 隨機從集合中返回指定的個數(shù)元素:srandmember key [count]到忽;
- 從集合隨機彈出元素:spop key;
- 獲取全部元素:smembers key护蝶;
2.集合間操作
- 取交集:sinter key [key ...]持灰;
- 取并集:suinon key [key ...]负饲;
- 取差集:sdiff key [key ...];
三妥泉、內(nèi)部編碼
集合類型的內(nèi)部編碼有兩種:
- intset(整數(shù)集合):當集合中的元素都是整數(shù)且元素個數(shù)小于set-max-intset-entries配置(默認512個)時洞坑,Redis會選用intset來作為集合的內(nèi)部實現(xiàn),從而減少內(nèi)存的使用刽沾;
- hashtable(哈希表):當集合類型無法滿足intset的條件時排拷,Redis會使用hashtable作為集合的內(nèi)部實現(xiàn);
在實際開發(fā)過程中布蔗,合理地設計集合元素類型浪腐,并預估元素個數(shù),可以有效減少內(nèi)存資源的消耗。
四淆游、使用場景
集合類型典型的使用場景是標簽功能(tag)隔盛,標簽數(shù)據(jù)對用戶體驗以及增強用戶粘度比較重要(在推薦系統(tǒng)中尤其重要)吮炕;
下面簡單介紹如何使用集合類型實現(xiàn)標簽功能的若干功能:
1.給用戶添加標簽:
sadd user:1:tags tag1 tag2 tag3
sadd user:2:tags tag1 tag2 tag4
...
sadd user:2:tags tag1 tag2 tag5
2.給標簽添加用戶:
sadd tag1:users user:1 user:2
sadd tag2:users user:1 user:3
...
sadd tag3:users user:1 user:4
3.刪除用戶下的標簽:
srem user:1:tags tag1 tag5
4.計算用戶通過感興趣的標簽:
sinter user:1:tags user:2:tags
備注:在開發(fā)過程中访得,用戶和標簽的關(guān)系維護應該在一個事務里面執(zhí)行,防止部分命令失敗造成數(shù)據(jù)不一致鳄炉。
總結(jié):實際開發(fā)一個標簽系統(tǒng)遠不止以上這些搜骡,還有很多復雜的情況需要考慮,不過集合類型的應用場景通常為以下幾種:
- sadd = Tags(標簽)
- spop/srandmember = Random item(生成隨機數(shù)谈竿,抽獎活動/抽卡游戲)
- sadd + sinter = Social Graph(社交需求)
感謝閱讀~
參考資料:
《Redis開發(fā)與運維》