1. 程式人生 > >redis資料結構之 intset

redis資料結構之 intset

整數集合intset用於有序、無重複地儲存多個整數值,根據集合中元素的值自動選擇使用整數型別來儲存元素,例如:如果intset中絕對值最大的整數可以用int32_t來儲存,那麼整個intset中所有元素都使用int32_t來儲存。

如果當前intset所使用的型別不能儲存一個即將加入到該intset的新元素時候,需要對intset進行升級,比如新元素的型別是int64_t,而當前intset的型別是int32_t,那麼升級就是先將intset中所有元素由int32_t轉換為int64_t,然後再插入新元素。

對於int8_t,int32_t,int64_t我個人的理解就應該分別對應char,int,long long,使用int8_t,int32_t,int64_t應該是為了區分平臺的差異吧,具體的可以檢視stdint.h檔案。

整數集合的資料結構

?
1 2 3 4 5 typedef struct intset { uint32_t encoding; //所使用型別的長度,4\8\16 uint32_t length; //元素個數 int8_t contents[]; //儲存元素的陣列 } intset;

encoding的值是下面三個常量中的一個:

#define INTSET_ENC_INT16 (sizeof(int16_t))

#define INTSET_ENC_INT32 (sizeof(int32_t))

#define INTSET_ENC_INT64 (sizeof(int64_t))

contents陣列用來實際儲存資料,陣列中元素的特性:無重複元素;元素在陣列中遞增排列。

整數集合相關API介紹

函式名稱

作用

複雜度

_intsetValueEncoding

獲取給定整數的編碼型別

O(1)

_intsetGet

根據索引獲取整數值

O(1)

_intsetSet

根據索引設定給定整數值

O(1)

intsetNew

新建intset

O(1)

intsetResize

為給定的intset重新分配記憶體

O(1)

intsetSearch

查詢給定的整數是否在intset中

O(logN)

intsetUpgradeAndAdd

先升級intset然後插入元素

O(N)

intsetAdd

直接新增元素

O(N)

intsetMoveTail

將intset中元素偏移

O(N)

intsetRemove

刪除元素

O(N)

intsetRandom

隨機返回一個intset中元素

O(1)

intsetLen

intset中元素的個數

O(1)

intsetBlobLen

intset所佔的位元組數

O(1)

重要API原始碼的簡單解析

intsetAdd

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 //新增一個整數 intset *intsetAdd(intset *is, int64_t value, uint8_t *success) { uint8_t valenc = _intsetValueEncoding(value); //得到型別的長度 uint32_t pos; if (success) *success = 1; /* Upgrade encoding if necessary. If we need to upgrade, we know that * this value should be either appended (if > 0) or prepended (if < 0), * because it lies outside the range of existing values. */ //需要升級,那麼進行升級並插入新值 if (valenc > intrev32ifbe(

相關推薦

redis資料結構 intset

整數集合intset用於有序、無重複地儲存多個整數值,根據集合中元素的值自動選擇使用整數型別來儲存元素,例如:如果intset中絕對值最大的整數可以用int32_t來儲存,那麼整個intset中所有元素都使用int32_t來儲存。 如果當前intset所使用的型

深入剖析Redis系列(八) - Redis資料結構集合

前言 集合(set)型別也是用來儲存多個 字串元素,但和 列表型別 不一樣的是,集合中 不允許有重複元素,並且集合中的元素是 無序的,不能通過 索引下標 獲取元素。 如圖所示,集合 user:1:follow 包含著 "it"、"music"、"his"、"sports

Redis資料結構雜湊詳解

簡介 Redis本身是鍵值對資料庫,但是值對應多種資料結構,其中就有雜湊(即鍵值對),值中的鍵值對稱為field和value。 基本命令 命令 命令描述 hset key field

Redis資料結構map 和 set 和 sortedset

map的結構是典型的字典結構 他的命令是H開頭的一些命令 hset 、hget 、hexists (用來判斷是否存在某個欄位 返回值是1 說明存在) 用途: 可以用來儲存類似物件的資料 一定要注意value不能 巢狀其他型別了 map的資料結構 在dict.

Redis資料結構字典

字典 描述 在字典中,一個鍵(key)可以和一個值(value)進行關聯(或者說將鍵對映為值),這些關聯的鍵和值就稱為鍵值對。 字典中的每個鍵都是獨一無二的,程式可以在字典中根據鍵查詢與之關聯的值,或者通過鍵來更新值,又或者根據鍵來刪除整個鍵值對,等

Redis資料結構hashes

儲存hash,String Key 和 String Value的map容器 hset 127.0.0.1:6379> hset myhash name tom (integer) 1 127.0.0.1:6379> keys * 1) "m

Redis 資料結構 SDS

`SDS(simple dynamic string)`,簡單動態字串。s同時它被稱為 Hacking String。hack 的地方就在 sds 儲存了字串的長度以及剩餘空間。sds 的實現在 `sds.c` 中。 C語言字串使用長度為n+1的字元陣列來表示長度為n的字串,並且字元陣列的最後一個元素總是空

Redis資料結構跳躍表

# 1、簡介 我們先不談Redis,來看一下跳錶。 ## 1.1、業務場景 **場景來自小灰的演算法之旅**,我們需要做一個拍賣行系統,用來查閱和出售遊戲中的道具,類似於魔獸世界中的拍賣行那樣,還有以下需求: 1. 拍賣行拍賣的商品需要支援四種排序方式,分別是:按價格、按等級、按剩餘時間、按出售者ID

Redis 資料結構字串的那些騷操作 -- 像讀小說一樣讀原始碼

Redis 字串底層用的是 sds 結構,該結構同 c 語言的字串相比,其優點是可以節省記憶體分配的次數,還可以... 這樣寫是不是讀起來很無聊?這些都是別人咀嚼過後,經過一輪兩輪三輪的再次咀嚼,吐出來的**精華**,這就是為什麼好多文章你覺得乾貨滿滿,但就是記不住說了什麼。我希望把這個咀嚼的過程,也講給你

Redis資料結構整數集合

# 1、整數集合 Redis 中有集合(set)的操作,常用的指令有 **SADD、SCARD 等**,而在底層的實現中,整數集合(intset)就是 Redis 集合的實現方式之一。 Redis 的集合是有序集合,intset 也是有序的。 根據 Redis 對集合的操作,我們可以大致想象出,ints

redis 系列6 資料結構字典(下)

一.概述   接著上篇繼續,這篇把資料結構之字典學習完, 這篇知識點包括:雜湊演算法,解決鍵衝突, rehash , 漸進式rehash,字典API。   1.1 雜湊演算法     當一個新的鍵值對 需要新增到字典裡面時,程式需要先根據“鍵值對”的鍵計算出雜湊值和索引值,再根據索引值,將包含新“鍵值對

redis 系列7 資料結構跳躍表

一.概述   跳躍表(skiplist)是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。在大部分情況下,跳躍表的效率可以和平衡樹(關係型資料庫的索引就是平衡樹結構)相媲美,並且因為跳躍表的實現比平衡樹要來得更為簡單,所以有不少程式使用跳躍表來代替平衡樹。   

redis 系列8 資料結構整數集合

一.概述   整數集合(intset)是集合鍵的底層實現之一, 當一個集合只包含整數值元素,並且這個集合元素數量不多時, Redis就會使用整數集合作為集合鍵的底層實現。下面建立一個只包含5個元素的集合鍵,並且集合中所有元素都是整數值,那麼這個集合鍵的底層實現就會是整數集合。 接著新增非整數值,集合鍵的底層

redis 系列5 資料結構字典(上)

原文: redis 系列5 資料結構之字典(上) 一. 概述   字典又稱符號表(symbol table),關聯陣列(associative array), 對映(map),是一種用於儲存鍵值對(key-value pair)的抽象資料結構。在字典中,一個key和一個value進行關聯稱為鍵值對。在字典

Redis資料結構字串

  今天呢,學習下Redis的資料結構,開始進入正題......   redis支援五種資料型別:       字串(String)       字串列表(list)       有序字串集合(sorted set)        雜湊(hash)      字串

Redis資料結構List

儲存list:       ArrayList使用陣列方式     LinkedList使用雙向連結方式 這裡主要講如下兩種:      雙向連結表中增加資料     雙向連結表中刪除資料 儲存list常用命令: 兩端新增 兩端彈出 擴充套件命令 lp

Redis資料結構Set

儲存Set      和List型別不同的是,Set集合中不允許出現重複的元素     Set可包含的最大元素數量是4294967295 儲存set常用命令:       新增/刪除元素       獲取集合中的元素       集合中的差集運算       集

Redis資料結構sorted-set

儲存Sorted-Set Sorted-Set和Set的區別:         Sorted-Set中的成員在集合中的位置是有序的 儲存Sorted-set常用命令        新增元素        獲得元素        刪除元素        範圍查詢

redis資料結構 String 和

請允許我拽一句文化詞兒 工欲善其事必先利其器。 這裡的器就是我們redis的根本 有什麼樣的資料結構決定了它適合做什麼樣的事兒。 ------------------------------------------------------------分割線---

redis 系列4 資料結構連結串列

一. 概述   連結串列提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可能通過增刪節點來靈活地調整連結串列的長度。作為一種資料結構,在C語言中並沒有內建的這種資料結構。所以Redis構建了自己的連結串列實現。連結串列在Redis中應用非常多,比如列表鍵的底層實現之一就是連結串列,當一個列表鍵包含了數