最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

  // 集合包含的元素數(shù)量
  uint32_t length;

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

} intset;

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

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

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 為空時的情況
  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. */
    // 因為底層數(shù)組是有序的,如果 value 比數(shù)組中最后一個值都要大
    // 那么 value 肯定不存在于集合中,
    // 并且應(yīng)該將 value 添加到底層數(shù)組的最末端
    if (value > _intsetGet(is,intrev32ifbe(is->length)-1)) {
      if (pos) *pos = intrev32ifbe(is->length);
      return 0;
    // 因為底層數(shù)組是有序的,如果 value 比數(shù)組中最前一個值都要小
    // 那么 value 肯定不存在于集合中,
    // 并且應(yīng)該將它添加到底層數(shù)組的最前端
    } else if (value < _intsetGet(is,0)) {
      if (pos) *pos = 0;
      return 0;
    }
  }

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

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

相關(guān)文章

  • redis lua腳本實戰(zhàn)秒殺和減庫存的實現(xiàn)

    redis lua腳本實戰(zhàn)秒殺和減庫存的實現(xiàn)

    本文主要是學(xué)習(xí)一下redis lua腳本的編寫,以及在redisson這個redis客戶端中是怎樣使用的,實戰(zhàn)一下秒殺場景redis減庫存lua腳本的編寫,并偽真實環(huán)境壓測查看效果。感興趣的可以了解一下
    2021-11-11
  • Redis緩存工具封裝實現(xiàn)

    Redis緩存工具封裝實現(xiàn)

    本文主要介紹了Redis緩存工具封裝實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 啟動redis出現(xiàn)閃退情況的解決辦法

    啟動redis出現(xiàn)閃退情況的解決辦法

    最近使用Redis遇到啟動閃退的問題,查閱資料后在一位大神的文章中找到了答案,這篇文章主要給大家介紹了關(guān)于啟動redis出現(xiàn)閃退情況的解決辦法,需要的朋友可以參考下
    2023-11-11
  • Redis批量刪除KEY的方法

    Redis批量刪除KEY的方法

    這篇文章主要介紹了Redis批量刪除KEY的方法,本文借助了Linux xargs命令實現(xiàn),需要的朋友可以參考下
    2014-11-11
  • RedisDesktopManager?連接redis的方法

    RedisDesktopManager?連接redis的方法

    這篇文章主要介紹了RedisDesktopManager?連接redis,需要的朋友可以參考下
    2023-08-08
  • redis中隊列消息實現(xiàn)應(yīng)用解耦的方法

    redis中隊列消息實現(xiàn)應(yīng)用解耦的方法

    這篇文章主要給大家介紹了關(guān)于redis中隊列消息實現(xiàn)應(yīng)用解耦的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • redis+mysql+quartz 一種紅包發(fā)送功能的實現(xiàn)

    redis+mysql+quartz 一種紅包發(fā)送功能的實現(xiàn)

    這篇文章主要介紹了redis+mysql+quartz 一種紅包發(fā)送功能的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Redis實現(xiàn)分布式事務(wù)的示例

    Redis實現(xiàn)分布式事務(wù)的示例

    Redis雖不支持傳統(tǒng)SQL數(shù)據(jù)庫ACID特性的事務(wù),但提供了事務(wù)特性,允許多命令捆綁執(zhí)行,通過命令MULTI、EXEC、DISCARD、WATCH實現(xiàn),感興趣的可以了解一下
    2024-10-10
  • Redis與本地緩存的結(jié)合實現(xiàn)

    Redis與本地緩存的結(jié)合實現(xiàn)

    我們開發(fā)中經(jīng)常用到Redis作為緩存,本文主要介紹了Redis與本地緩存的結(jié)合實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Redis哨兵模式介紹

    Redis哨兵模式介紹

    這篇文章介紹了Redis哨兵模式,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02

最新評論

迭部县| 武邑县| 当涂县| 水富县| 山阴县| 如皋市| 会理县| 石泉县| 博白县| 双江| 宜都市| 荥经县| 黔南| 高清| 平潭县| 句容市| 成武县| 嘉荫县| 重庆市| 惠安县| 甘德县| 准格尔旗| 上虞市| 连州市| 蒲城县| 鹿泉市| 宁乡县| 申扎县| 大新县| 灵寿县| 昭觉县| 镇赉县| 土默特左旗| 安庆市| 宜良县| 青岛市| 永平县| 普洱| 阿拉善左旗| 农安县| 澎湖县|