第六章 整數(shù)集合

  • 整數(shù)集合(intset)是集合鍵的底層實(shí)現(xiàn)之一亏钩,當(dāng)一個(gè)集合只包含整數(shù)值元素契沫,并且這個(gè)集合的元素?cái)?shù)量不多時(shí)沛婴,Redis就會(huì)使用整數(shù)集合作為集合鍵的底層實(shí)現(xiàn)吼畏。

6.1整數(shù)集合的實(shí)現(xiàn)

  • 整數(shù)集合可以保存的類型為int16_t , int32_t , int64_t的整數(shù)值,并且集合中不會(huì)出現(xiàn)重復(fù)的元素嘁灯。

結(jié)構(gòu)表示:

typedef struct inset{
      //編碼方式
      uint32_t encoding;
      //集合包含的元素?cái)?shù)量
      uint32_t length;
      //保存元素的數(shù)組
      int8_t contents[];
}intset;
WechatIMG64.jpeg
  • contents 數(shù)組是整數(shù)集合的底層實(shí)現(xiàn)泻蚊;數(shù)組中按值的大小從小到大的有序排列,數(shù)組中不包含任何重復(fù)項(xiàng)丑婿。
  • length 記錄了整數(shù)集合中元素的數(shù)量

雖然intset結(jié)構(gòu)將contents屬性聲明為int8_t類型的數(shù)組性雄,實(shí)際上contents數(shù)組不保存任何int8_t類型的值没卸,真正的類型取決于encoding屬性的值:

  • 如果encoding 值為 INTSET_ENC_INT16 那么contents就是一個(gè)int16_t類型的數(shù)組(-32768 ~ 32767)
  • 如果encoding 值為 INTSET_ENC_INT32 那么contents就是一個(gè)int32_t類型的數(shù)組(-2147483648 ~ 2147483647)
  • 如果encoding 值為 INTSET_ENC_INT64 那么contents就是一個(gè)int64_t類型的數(shù)組(-9223372036854775808 ~ 9223372036854775807 )

當(dāng)向一個(gè)底層為int16_t數(shù)組的整數(shù)集合中添加一個(gè)int64_t類型的數(shù)值時(shí),整數(shù)集合中所有的元素都會(huì)被轉(zhuǎn)換為int64_t類型秒旋!

6.2升級(jí)

  • 將一個(gè)新元素添加到整數(shù)集合里面约计,新元素類型比整數(shù)集合現(xiàn)有所有元素類型都要長(zhǎng)時(shí),整數(shù)集合需要先進(jìn)行升級(jí)迁筛,才能將新元素添加到整數(shù)集合里面煤蚌。

升級(jí)步驟:

  1. 根據(jù)新元素的類型,擴(kuò)展整數(shù)集合底層數(shù)組的空間大小细卧,并為新元素分配空間尉桩。
  2. 將底層數(shù)組現(xiàn)有的所有元素都轉(zhuǎn)換成與新元素相同的類型,將類型轉(zhuǎn)換后的元素放到正確的位置上贪庙,在放置元素過程中蜘犁,繼續(xù)維持底層數(shù)組的有序性質(zhì)不變
  3. 將新元素添加到底層數(shù)組里面

每次向整數(shù)集合添加新元素都可能會(huì)引起升級(jí),每次升級(jí)都需要對(duì)底層數(shù)組中已有的所有元素進(jìn)行類型轉(zhuǎn)換止邮;時(shí)間復(fù)雜度為O(n)

6.3升級(jí)的好處

升級(jí)策略有兩個(gè)好處:

  • 提升整數(shù)的靈活性:整數(shù)集合通過自動(dòng)升級(jí)底層數(shù)組來適應(yīng)新的元素这橙,隨意的將int16_t, int32_t, 或者int64_t 的整數(shù)添加到集合中,不必?fù)?dān)心出現(xiàn)類型錯(cuò)誤导披,這種做法非常靈活屈扎。
  • 盡可能的節(jié)約內(nèi)存:可以讓集合能同時(shí)保存三種不同類型的值,又可以確保升級(jí)操作只會(huì)在有需要的時(shí)候進(jìn)行盛卡,這可以盡量節(jié)省內(nèi)存助隧。

6.4降級(jí)

  • 整數(shù)集合不支持降級(jí)操作,一旦對(duì)數(shù)組進(jìn)行了升級(jí)滑沧,編碼就會(huì)一直保持升級(jí)后的狀態(tài)并村。

整數(shù)集合API

函數(shù): 作用 時(shí)間復(fù)雜度
intsetNew:創(chuàng)建一個(gè)新的整數(shù)集合 O(1)
intsetAdd:將給定的元素添加到整數(shù)集合里面 O(n)
intsetRemove:從整數(shù)集合中移除給定元素 O(n)
intsetFind:檢查給定值是否存在于集合 O(logN)
intsetRandom:從整數(shù)集合中隨機(jī)返回一個(gè)元素 O(1)
intsetGet:取出底層數(shù)組在給定索引上的元素 O(1)
intsetLen:返回整數(shù)集合包含的元素個(gè)數(shù) O(1)
intsetBlobLen:返回整數(shù)集合占用的內(nèi)存字節(jié)數(shù) O(1)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市滓技,隨后出現(xiàn)的幾起案子哩牍,更是在濱河造成了極大的恐慌,老刑警劉巖令漂,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膝昆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叠必,警方通過查閱死者的電腦和手機(jī)荚孵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纬朝,“玉大人收叶,你說我怎么就攤上這事」部粒” “怎么了判没?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蜓萄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我澄峰,道長(zhǎng)嫉沽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任俏竞,我火速辦了婚禮绸硕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胞此。我一直安慰自己臣咖,他們只是感情好跃捣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布漱牵。 她就那樣靜靜地躺著,像睡著了一般疚漆。 火紅的嫁衣襯著肌膚如雪酣胀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天娶聘,我揣著相機(jī)與錄音闻镶,去河邊找鬼。 笑死丸升,一個(gè)胖子當(dāng)著我的面吹牛铆农,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狡耻,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼墩剖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了夷狰?” 一聲冷哼從身側(cè)響起岭皂,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沼头,沒想到半個(gè)月后爷绘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡进倍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年土至,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猾昆。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陶因,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毡庆,到底是詐尸還是另有隱情坑赡,我是刑警寧澤烙如,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站毅否,受9級(jí)特大地震影響亚铁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜螟加,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一徘溢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捆探,春花似錦然爆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至助被,卻和暖如春剖张,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揩环。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工搔弄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丰滑。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓顾犹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親褒墨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炫刷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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