redis是一種非關係型資料庫,常用的資料型別主要有五種,分別為string,list,hash,set,zset,那麼他們對應的資料結構分別是什麼呢?
顧名思義,字串的資料型別最簡單,就是使用了string,沒有用到複雜的資料結構。
列表(list)支援儲存一組資料,對應的資料結構有兩種,一種是壓縮列表(ziplist),一種是雙向迴圈列表。
但是使用壓縮列表的時候是有條件的:
單個資料小於64位元組
資料個數小於512
為啥使用兩種資料結構呢?使用一種不是更簡單,這主要是因為redis本身是記憶體資料庫,所以就要盡可能的節省記憶體空間,而壓縮列表恰恰能滿足這個,壓縮列表並不是一種基本的資料結構,而是redis自己設計的一種資料結構,類似資料,通過連續的記憶體空間儲存資料,但是跟陣列不同的一點是它儲存的資料大小是不同的,我們知道資料要求每個元素的大小是相同的,如果要儲存不同長度的資料,我們就需要最大長度的資料作為元素的大小,當資料小於這個長度時就會浪費部分空間,所以壓縮列表便可以起到節省記憶體的作用。
為啥資料個數要求是512個呢?這是由於因為壓縮列表每個資料的長度時不一樣的,所以壓縮列表在查詢資料時並不能按照下標查詢的,而是需要遍歷進行查詢,所以如果資料個數過多,那麼申請的記憶體就會過大,這是我們不想看到的。所以當不滿足上面那兩個條件時,就需要使用雙向鍊錶來儲存了。
hash又名字典,主要儲存鍵值對,hash也有兩種實現方式,一種是壓縮列表,一種是雜湊表。
同樣需要滿足兩個條件時,才會使用壓縮列表。
鍵和值的大小都要小於64位元組
欄位的鍵值對數量要小於512
當不滿足上面兩個條件時,才會使用雜湊表。其中redis使用了murmurhash2演算法作為hash函式,對於hash衝突時,redis使用的事鍊錶法來解決的。
set主要是用來儲存一組不同的資料,這個資料也是有兩種實現方式,一種是有序陣列,一種是雜湊表。
使用有序陣列是有兩個條件:
儲存的資料都是整數
儲存的資料元素不超過512
有序集合用來儲存一組資料,同時每個資料又會附帶乙個得分,通過得分的大小來對資料進行排序。有序集合也有兩種實現方式,一種是壓縮列表,一種是跳表。
當滿足下面兩個條件時,會使用壓縮列表:
所有資料大小小於64位元組
元素個數小於128
跳表(skiplist) 也是redis設計的一種資料結構,它支援快速的插入,刪除、查詢操作,可以替代紅黑樹。跳表的實現主要使用了多級索引,具體的細節可以參考:
redis常用的資料型別底層依賴的資料結構,大致有這五種:壓縮列表,有序陣列,雙向鍊錶,雜湊表,跳表,大致的思路也分析了一下,可能有些偏差還請指教。
STL中常用資料結構
stl中常用的資料結構 1 stack queue預設的底層實現為deque結構。2 deque 用map管理多個size大小的連續記憶體塊,方便頭尾插入。3 vector 變長動態陣列,每次增大1.5倍,刪除元素時不釋放空間。4 priority queue底層預設採用vector向量o nlog...
STL中常用資料結構
stl中常用的資料結構 1 stack queue預設的底層實現為deque結構。2 deque 用map管理多個size大小的連續記憶體塊,方便頭尾插入。3 vector 變長動態陣列,每次增大1.5倍,刪除元素時不釋放空間。4 priority queue底層預設採用vector向量o nlog...
資料結構中常用演算法
排序常用的演算法有 插入演算法 直接插入演算法 折半插入演算法 希爾演算法 選擇演算法 簡單選擇演算法 堆排序演算法 快速演算法 氣泡排序 快速排序演算法 以下程式給出了各種演算法的實現,其介面為void sort int array,int len 每個檔案實現乙個演算法,最後和main.c檔案編...