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

Redis數(shù)據(jù)結(jié)構(gòu)之intset整數(shù)集合使用學(xué)習(xí)

 更新時(shí)間:2023年07月03日 17:21:04   作者:Hunter  
這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之整數(shù)集合使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Redis數(shù)據(jù)結(jié)構(gòu)intset

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

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

1、整數(shù)集合

以下是整數(shù)集合的結(jié)構(gòu):

typedef struct intset{
    // 編碼方式
    uint32_t encoding;
    // 集合包含的元素?cái)?shù)量
    uint_32_t length;
    // 保存元素的數(shù)組
    int8_t contents[];
}

其中,encoding 屬性的值為 INTSET_ENC_INT16,INTSET_ENC_INT32INTSET_ENC_INT64,分別表示 contents 數(shù)組里存儲(chǔ)的整數(shù)類(lèi)型是 int16_t,int32_t,int64_t

當(dāng) encoding 的值為 INTSET_ENC_INT16,contents 數(shù)組里每個(gè)項(xiàng)都是 int16_t 類(lèi)型的整數(shù)值,范圍在 -215 ~ 2 15 - 1 之間,也就是 -32768 ~ 32767

當(dāng) encoding 的值為 INTSET_ENC_INT32,contents 數(shù)組里每個(gè)項(xiàng)都是 int32_t 類(lèi)型的整數(shù)值,范圍在 -231 ~ 2 31 - 1 之間

當(dāng) encoding 的值為 INTSET_ENC_INT64,contents 數(shù)組里每個(gè)項(xiàng)都是 int64_t 類(lèi)型的整數(shù)值,范圍在 -263 ~ 2 63 - 1 之間

length 屬性記錄的是整數(shù)集合中包含的元素?cái)?shù)量,也就是 contents 數(shù)組的長(zhǎng)度。

contents 數(shù)組中的數(shù)值按值的大小從小到大有序排列,并且不包含重復(fù)項(xiàng)。

contents 數(shù)組中包含的元素類(lèi)型都是一樣的,比如當(dāng)前數(shù)組中元素的類(lèi)型是 int16_t,如果要向其中插入的整數(shù)值的類(lèi)型是 int32_t,那么 contents 數(shù)組就要將 contents 數(shù)組的元素類(lèi)型先升級(jí)再插入,這個(gè)就涉及升級(jí)的操作。

2、升級(jí)

當(dāng)我們要添加到整數(shù)集合中的元素的類(lèi)型比現(xiàn)有所有元素類(lèi)型都要長(zhǎng)時(shí),整數(shù)集合需要進(jìn)行升級(jí)(upgrade)操作,然后才能將新元素插入整數(shù)集合中。

升級(jí)并添加新元素共分為三步進(jìn)行:

  • 根據(jù)新元素類(lèi)型,擴(kuò)展整數(shù)集合底層數(shù)組的空間大小,并為新元素分配空間
  • 將底層數(shù)組所有元素轉(zhuǎn)換成與新元素相同的類(lèi)型,并將類(lèi)型轉(zhuǎn)換后的元素放在正確的位上,且維持其有序性不變
  • 將新元素添加到底層數(shù)組里面

對(duì)于整數(shù)的三種類(lèi)型,int16_t,int32_t,int64_t,每種類(lèi)型的數(shù)據(jù)占用的位數(shù)分別是 16,32,64

假設(shè)當(dāng)前 contents 數(shù)組有三個(gè)元素:1,2,3。類(lèi)型是 int16_t,對(duì)應(yīng)的元素和位數(shù)展示如下:

0-15位16-31位32-47位
元素123

接下來(lái)需要添加一個(gè)整數(shù),65535,類(lèi)型是 int32_t,那么就需要先分配額外的空間,新分配的空間長(zhǎng)度等于元素總數(shù) 新類(lèi)型的位數(shù) - 原有空間長(zhǎng)度 = 4 32 - 48 = 80:

0-15位16-31位32-47位48-127位
元素123新分配空間

然后分別將元素 3,2,1 移動(dòng)到對(duì)應(yīng)的空間內(nèi),再將新元素 65535 放在對(duì)應(yīng)的空間上:

0-31位32-63位64-95位96-127位
元素12365535

然后將整數(shù)集合 encoding 屬性的值從 INTSET_ENC_INT16 改為 INTSET_ENC_INT32,length 屬性的值從 3 改為 4。

3、升級(jí)的好處

為整數(shù)集合使用升級(jí)策略有兩個(gè)好處,一個(gè)是提升整數(shù)集合的靈活性,一個(gè)是盡可能的節(jié)約內(nèi)存

因?yàn)?C語(yǔ)言是靜態(tài)類(lèi)型語(yǔ)言,通常不會(huì)將兩種不同類(lèi)型的值放在一個(gè)數(shù)據(jù)結(jié)構(gòu)里,但是整數(shù)集合可以通過(guò)自動(dòng)升級(jí)底層數(shù)組來(lái)適應(yīng)新元素,所以我們可以隨意將 int16_t,int32_t,int64_t 類(lèi)型的整數(shù)添加到集合中,而不必?fù)?dān)心出現(xiàn)類(lèi)型錯(cuò)誤

另外,要讓數(shù)組可以同時(shí)保存 int16_t,int32_t,int64_t 這三種類(lèi)型的整數(shù),最簡(jiǎn)單的方式是直接使用 int64_t 類(lèi)型的數(shù)組去保存數(shù)據(jù),但這樣的話(huà)如果元素都是 int16_t,int32_t 類(lèi)型的值,那么會(huì)出現(xiàn)浪費(fèi)內(nèi)存的情況。

因此現(xiàn)在升級(jí)策略可以盡量節(jié)約內(nèi)存。

4、降級(jí)

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

比如前面的數(shù)組 1,2,3,65535,如果我們刪除了 65535,整數(shù)集合還是會(huì)維持原有 INTSET_ENC_INT64 的編碼,底層數(shù)組也還是 int64_t 類(lèi)型的。

以上就是Redis數(shù)據(jù)結(jié)構(gòu)之intset整數(shù)集合使用學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于Redis數(shù)據(jù)結(jié)構(gòu)intset的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入理解Redis大key的危害及解決方案

    深入理解Redis大key的危害及解決方案

    本文主要介紹了深入理解Redis大key的危害及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • redis集群搭建_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis集群搭建_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了redis集群搭建,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Redis中管道操作pipeline的實(shí)現(xiàn)

    Redis中管道操作pipeline的實(shí)現(xiàn)

    RedisPipeline是一種優(yōu)化客戶(hù)端與服務(wù)器通信的技術(shù),通過(guò)批量發(fā)送和接收命令減少網(wǎng)絡(luò)往返次數(shù),提高命令執(zhí)行效率,本文就來(lái)介紹一下Redis中管道操作pipeline的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Redis遠(yuǎn)程字典服務(wù)器?hash類(lèi)型示例詳解

    Redis遠(yuǎn)程字典服務(wù)器?hash類(lèi)型示例詳解

    這篇文章主要介紹了Redis遠(yuǎn)程字典服務(wù)器?hash類(lèi)型示例詳解,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 使用redis-plus-plus庫(kù)連接redis的實(shí)現(xiàn)方法

    使用redis-plus-plus庫(kù)連接redis的實(shí)現(xiàn)方法

    本文主要介紹了使用redis-plus-plus庫(kù)連接redis的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 淺談redis五大數(shù)據(jù)結(jié)構(gòu)和使用場(chǎng)景

    淺談redis五大數(shù)據(jù)結(jié)構(gòu)和使用場(chǎng)景

    這篇文章主要介紹了淺談redis五大數(shù)據(jù)結(jié)構(gòu)和使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • redis中session會(huì)話(huà)共享的三種方案

    redis中session會(huì)話(huà)共享的三種方案

    本文探討了分布式系統(tǒng)中Session共享的三種解決方案,包括粘性會(huì)話(huà)、Session復(fù)制以及基于Redis的集中存儲(chǔ),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-08-08
  • Redis 多規(guī)則限流和防重復(fù)提交方案實(shí)現(xiàn)小結(jié)

    Redis 多規(guī)則限流和防重復(fù)提交方案實(shí)現(xiàn)小結(jié)

    本文主要介紹了Redis 多規(guī)則限流和防重復(fù)提交方案實(shí)現(xiàn)小結(jié),包括使用String結(jié)構(gòu)和Zset結(jié)構(gòu)來(lái)記錄用戶(hù)IP的訪(fǎng)問(wèn)次數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • redis操作學(xué)習(xí)記錄

    redis操作學(xué)習(xí)記錄

    這篇文章主要介紹了redis操作,記錄總結(jié)了Redis客戶(hù)端、服務(wù)器、string、hash、list、發(fā)布/訂閱、事務(wù)等相關(guān)概念、原理與操作技巧,需要的朋友可以參考下
    2020-04-04
  • redis使用watch秒殺搶購(gòu)實(shí)現(xiàn)思路

    redis使用watch秒殺搶購(gòu)實(shí)現(xiàn)思路

    這篇文章主要為大家詳細(xì)介紹了redis使用watch秒殺搶購(gòu)的實(shí)現(xiàn)思路,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評(píng)論

敦化市| 霸州市| 四平市| 平谷区| 罗定市| 留坝县| 益阳市| 罗田县| 凤阳县| 澄迈县| 梓潼县| 洪湖市| 平和县| 慈溪市| 南郑县| 曲阜市| 吐鲁番市| 乾安县| 华宁县| 乐陵市| 清涧县| 博爱县| 荥阳市| 罗江县| 闽清县| 自贡市| 达日县| 内丘县| 宁夏| 邯郸县| 南川市| 紫金县| 昭通市| 大竹县| 蕉岭县| 开鲁县| 林周县| 遂平县| 安新县| 城步| 普兰县|