麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 數(shù)據(jù)庫(kù) > Redis > 正文

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

2020-03-17 12:36:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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ù)的示例:

redis,intset,數(shù)據(jù)結(jié)構(gòu)之intset的使用方法

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Redis頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 色欧美视频| 成人毛片100部免费观看 | 日韩视频一区二区三区在线观看 | 欧美激情性色生活片在线观看 | 久久精品电影网 | 爽爽淫人综合网网站 | 91久久精品一区二区 | 最新欧美精品一区二区三区 | 一区二区三区黄色 | 毛片免费在线观看视频 | 亚洲国产精品99 | 欧美黄一区 | 国产一区二区三区精品在线观看 | 欧美hdfree性xxxx | 国产91av视频 | 亚洲人片在线观看 | 免费在线观看成年人视频 | 欧美成人免费香蕉 | 在线中文资源免费 | 中文字幕激情视频 | 91av日韩 | 欧美成人精品欧美一级 | 黄色伊人网站 | 深夜福利久久久 | 黄色片快播 | 一级黄色免费观看 | 一级黄色免费大片 | 污版视频在线观看 | 91精品久久久久久久久久久 | 精品xxxx户外露出视频 | 国产女同疯狂激烈互摸 | 99精品国产一区二区三区 | 欧美一级黄带 | 久久影院免费观看 | 91久久久久久亚洲精品禁果 | 亚洲视屏 | 欧美成人精品h版在线观看 国产一级淫片在线观看 | 欧美精品成人 | 日本羞羞的午夜电视剧 | 国产精品夜色视频一级区 | 在线中文日韩 |