欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解

 更新時(shí)間:2017年09月22日 14:18:51   作者:愛(ài)寶貝丶  
這篇文章主要介紹了redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解的相關(guān)資料, intset也即整數(shù)集合,當(dāng)集合保存的值數(shù)量不多時(shí),redis使用intset作為其底層數(shù)據(jù)保存結(jié)構(gòu),希望通過(guò)本文能幫助到大家,需要的朋友可以參考下

redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解

 在redis中,intset主要用于保存整數(shù)值,由于其底層是使用數(shù)組來(lái)保存數(shù)據(jù)的,因而當(dāng)對(duì)集合進(jìn)行數(shù)據(jù)添加時(shí)需要對(duì)集合進(jìn)行擴(kuò)容和遷移操作,因而也只有在數(shù)據(jù)量不大時(shí)redis才使用該數(shù)據(jù)結(jié)構(gòu)來(lái)保存整數(shù)集合。其具體的底層數(shù)據(jù)結(jié)構(gòu)如下:

typedef struct intset {
  
  // 編碼方式
  uint32_t encoding;

  // 集合包含的元素?cái)?shù)量
  uint32_t length;

  // 保存元素的數(shù)組
  int8_t contents[];

} intset;

      整數(shù)集合主要有三個(gè)屬性:encoding用于保存當(dāng)前集合的編碼,有16位,32位和64位三種;length保存了當(dāng)前整數(shù)集合中保存的數(shù)據(jù)數(shù)量;contents屬性則保存了具體的數(shù)據(jù),其每個(gè)數(shù)據(jù)占用的位數(shù)由encoding屬性指定。

      這里主要需要進(jìn)行說(shuō)明的是redis的intset中數(shù)據(jù)是采用從小到大的順序存儲(chǔ)的,因而對(duì)于數(shù)據(jù)的查詢(xún)可以采用二分法進(jìn)行查詢(xún),具體的搜索代碼如下:

static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos) {
  int min = 0, max = intrev32ifbe(is->length)-1, mid = -1;
  int64_t cur = -1;

  /* The value can never be found when the set is empty */
  // 處理 is 為空時(shí)的情況
  if (intrev32ifbe(is->length) == 0) {
    if (pos) *pos = 0;
    return 0;
  } else {
    /* Check for the case where we know we cannot find the value,
     * but do know the insert position. */
    // 因?yàn)榈讓訑?shù)組是有序的,如果 value 比數(shù)組中最后一個(gè)值都要大
    // 那么 value 肯定不存在于集合中,
    // 并且應(yīng)該將 value 添加到底層數(shù)組的最末端
    if (value > _intsetGet(is,intrev32ifbe(is->length)-1)) {
      if (pos) *pos = intrev32ifbe(is->length);
      return 0;
    // 因?yàn)榈讓訑?shù)組是有序的,如果 value 比數(shù)組中最前一個(gè)值都要小
    // 那么 value 肯定不存在于集合中,
    // 并且應(yīng)該將它添加到底層數(shù)組的最前端
    } else if (value < _intsetGet(is,0)) {
      if (pos) *pos = 0;
      return 0;
    }
  }

  // 在有序數(shù)組中進(jìn)行二分查找
  // T = O(log N)
  while(max >= min) {
    mid = (min+max)/2;
    cur = _intsetGet(is,mid);
    if (value > cur) {
      min = mid+1;
    } else if (value < cur) {
      max = mid-1;
    } else {
      break;
    }
  }

  // 檢查是否已經(jīng)找到了 value
  if (value == cur) {
    if (pos) *pos = mid;
    return 1;
  } else {
    if (pos) *pos = min;
    return 0;
  }
}

      此外,整數(shù)集合中具體還有兩個(gè)需要說(shuō)明的操作是升級(jí)和降級(jí)。升級(jí)指的是當(dāng)向低編碼的整數(shù)集合中添加位數(shù)較高的數(shù)值時(shí),就會(huì)擴(kuò)容并將整數(shù)集合中的所有元素都轉(zhuǎn)換為高位數(shù)的編碼格式,然后把新添加的元素插入到指定位置;降級(jí)指的是當(dāng)將整數(shù)集合中唯一一個(gè)高位的元素刪除時(shí)會(huì)將其余元素轉(zhuǎn)換為低位數(shù)的編碼格式,但是為了提升速率,redis中并不會(huì)為剩余元素重新分配內(nèi)存并進(jìn)行編碼轉(zhuǎn)換,而只是會(huì)將該高位元素給刪除,并重新分配內(nèi)存給剩余的元素,然后遷移數(shù)據(jù)。如圖是inset保存數(shù)據(jù)的示例:

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實(shí)例(詳解)

    CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實(shí)例(詳解)

    這篇文章主要介紹了CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實(shí)例,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Redis數(shù)據(jù)庫(kù)分布式設(shè)計(jì)方案介紹

    Redis數(shù)據(jù)庫(kù)分布式設(shè)計(jì)方案介紹

    大家好,本篇文章主要講的是Redis數(shù)據(jù)庫(kù)分布式設(shè)計(jì)方案介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-01-01
  • Redis中Hash類(lèi)型的使用

    Redis中Hash類(lèi)型的使用

    本文主要介紹了Redis中Hash類(lèi)型的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Redis Sentinel實(shí)現(xiàn)哨兵模式搭建小結(jié)

    Redis Sentinel實(shí)現(xiàn)哨兵模式搭建小結(jié)

    這篇文章主要介紹了Redis Sentinel實(shí)現(xiàn)哨兵模式搭建小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Redis分布式鎖解決超賣(mài)問(wèn)題的使用示例

    Redis分布式鎖解決超賣(mài)問(wèn)題的使用示例

    超賣(mài)問(wèn)題通常出現(xiàn)在多用戶(hù)并發(fā)操作的情況下,即多個(gè)用戶(hù)嘗試購(gòu)買(mǎi)同一件商品,導(dǎo)致商品庫(kù)存不足或者超賣(mài),本文就來(lái)介紹一下超賣(mài)問(wèn)題,感興趣的可以了解一下
    2023-09-09
  • Redis中事件驅(qū)動(dòng)模型示例詳解

    Redis中事件驅(qū)動(dòng)模型示例詳解

    Redis這個(gè)數(shù)據(jù)庫(kù)相信不用過(guò)多介紹了,大家應(yīng)該都知道,下面這篇文章主要給大家介紹了關(guān)于Redis中事件驅(qū)動(dòng)模型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 基于Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄項(xiàng)目示例(附源碼)

    基于Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄項(xiàng)目示例(附源碼)

    手機(jī)登錄驗(yàn)證在很多網(wǎng)頁(yè)上都得到使用,本文主要介紹了基于Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄項(xiàng)目示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Redis全量同步和增量同步原理

    Redis全量同步和增量同步原理

    主從第一次同步是全量同步:也就是說(shuō),當(dāng)你主從節(jié)點(diǎn)連接建立后,需要執(zhí)行一次全量同步,但如果slave重啟后同步,此時(shí)slave重啟后,slave節(jié)點(diǎn)和master節(jié)點(diǎn)的數(shù)據(jù)之間有落后,因此需要進(jìn)行增量同步,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • RedisTemplate 實(shí)現(xiàn)基于Value 操作的簡(jiǎn)易鎖機(jī)制(示例代碼)

    RedisTemplate 實(shí)現(xiàn)基于Value 操作的簡(jiǎn)易鎖機(jī)制(示例代碼)

    本文將介紹如何使用 RedisTemplate 的 opsForValue().setIfAbsent() 方法來(lái)實(shí)現(xiàn)一種簡(jiǎn)單的鎖機(jī)制,并提供一個(gè)示例代碼,展示如何在 Java 應(yīng)用中利用這一機(jī)制來(lái)保護(hù)共享資源的訪(fǎng)問(wèn),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • 聊一聊redis奇葩數(shù)據(jù)類(lèi)型與集群知識(shí)

    聊一聊redis奇葩數(shù)據(jù)類(lèi)型與集群知識(shí)

    現(xiàn)在越來(lái)越多的項(xiàng)目都會(huì)利用到redis,多實(shí)例redis服務(wù)比單實(shí)例要復(fù)雜的多,這里面涉及到定位、容錯(cuò)、擴(kuò)容等技術(shù)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于redis奇葩數(shù)據(jù)類(lèi)型與集群知識(shí)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01

最新評(píng)論