Redis學習筆記:Set類型內(nèi)部編碼及其應用場景

一、概述

集合(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ā)與運維》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空凸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呀洲,更是在濱河造成了極大的恐慌轿腺,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憔辫,死亡現(xiàn)場離奇詭異仿荆,居然都是意外死亡,警方通過查閱死者的電腦和手機锦亦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門令境,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抛蚁,你說我怎么就攤上這事∏扑Γ” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵爷辙,是天一觀的道長朦促。 經(jīng)常有香客問我,道長玷犹,這世上最難降的妖魔是什么洒疚? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任油湖,我火速辦了婚禮,結(jié)果婚禮上乏德,老公的妹妹穿的比我還像新娘。我一直安慰自己胧瓜,他們只是感情好郑什,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钝满,像睡著了一般申窘。 火紅的嫁衣襯著肌膚如雪弯蚜。 梳的紋絲不亂的頭發(fā)上碎捺,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天牵寺,我揣著相機與錄音,去河邊找鬼帽氓。 笑死黎休,一個胖子當著我的面吹牛玉凯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漫仆,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼盲厌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吗浩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤禁荸,失蹤者是張志新(化名)和其女友劉穎阀湿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陷嘴,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡罩旋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年涨醋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浴骂。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狡相,靈堂內(nèi)的尸體忽然破棺而出食磕,到底是詐尸還是另有隱情,我是刑警寧澤彬伦,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布单绑,位于F島的核電站,受9級特大地震影響歉提,放射性物質(zhì)發(fā)生泄漏区转。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一恋拷、第九天 我趴在偏房一處隱蔽的房頂上張望厅缺。 院中可真熱鬧,春花似錦诀豁、人聲如沸窥妇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拉宗,卻和暖如春辣辫,著一層夾襖步出監(jiān)牢的瞬間急灭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工葬馋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留点楼,地道東北人白对。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓甩恼,卻偏偏與公主長得像条摸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钉蒲,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容