1. 程式人生 > >redis的資料型別和儲存結構

redis的資料型別和儲存結構

一,什麼是redis

Redis(remote dictionary server)是一個基於KEY-VALUE的高效能的 儲存系統,通過提供多種鍵值資料型別來適應不同場景下的快取與儲存需求 。

二。redis的儲存結構

Redis比memached提供了更豐富的資料結構,有五種資料結構:string,list,hash,set,sorted-set 在這裡插入圖片描述 redis是以字典結構儲存資料的容器,並允許其他應用通過TCP協議讀寫字典中的內容,一個redis例項可以提供多個用來儲存資料的字典,可以指定把相應的資料儲存到哪個型別的字典裡面。

三。資料型別

1.字串型別: 可以儲存任何形式的字串,包括二進位制型別的資料,session,cookie,圖片等,一個字元型別鍵允許儲存的最大容量是512M 。string型別對應的是key和value,string型別預設支援三種資料格式:字串,整數,浮點

在Redis內部,String型別通過 int、SDS(simple dynamic string)作為結構儲存,int用來存放整型資料,sds存放字 節/字串和浮點型資料。Redis是用C語言寫的,在C的標準字串結構下進行了封裝,用來提升基本操作的效能,同時也充分利用已有的 C的標準庫,簡化實現邏輯。 使用場景:session共享,簡訊驗證碼等,在多臺Web伺服器之間想完成一個session共享的話,有幾種方式,session複製,cookie儲存,把所有的session儲存到redis裡面(把所有session序列化以後儲存到redis的字串裡面)。

2.列表 列表型別(list)可以儲存一個有序的字串列表,常用的操作是向列表兩端新增元素或者獲得列表的某一個片段。 列表型別內部使用雙向連結串列實現,所以向列表兩端新增元素的時間複雜度為O(1), 獲取越接近兩端的元素速度就越 快。即使是一個有幾千萬個元素的列表,獲取頭部或尾部的幾條記錄也是很快的 不同版本內部資料結構的差異: redis3.2之前,List型別的value物件內部以linkedlist或者ziplist來實現, 當list的元素個數和單個元素的長度比較小 的時候,Redis會採用ziplist(壓縮列表)來實現來減少記憶體佔用。否則就會採用linkedlist(雙向連結串列)結構。 redis3.2之後,採用的一種叫quicklist的資料結構來儲存list,列表的底層都由quicklist實現。 這兩種儲存方式都有優缺點,雙向連結串列在連結串列兩端進行push和pop操作,在插入節點上覆雜度比較低,但是記憶體開 銷比較大; ziplist儲存在一段連續的記憶體上,所以儲存效率很高,但是插入和刪除都需要頻繁申請和釋放記憶體; quicklist仍然是一個雙向連結串列,只是列表的每個節點都是一個ziplist,其實就是linkedlist和ziplist的結合,quicklist 中每個節點ziplist都能夠儲存多個數據元素, 使用場景:實現分散式佇列,棧 3.hash型別

在這裡插入圖片描述 把整體看作一個物件,每個field-value相當於物件的屬性和屬性值,這個整體的value是個二維表格的形式,可以儲存一些物件資訊,是個典型的字典結構,在value裡面不能在巢狀其他的資料型別的格式。 map提供兩種結構來儲存,一種是hashtable、另一種是ziplist,資料量小的時候用ziplist. 在redis中,哈 希表分為三層,分別是dictEntry,dictht ,dict : dictEntry 管理一個key-value,同時保留同一個桶中相鄰元素的指標,用來維護雜湊桶的內部鏈; dictht 實現一個hash表會使用一個buckets存放dictEntry的地址,一般情況下通過hash(key)%len得到的值就是buckets的 索引,這個值決定了我們要將此dictEntry節點放入buckets的哪個索引裡,這個buckets實際上就是我們說的hash 表。dict.h的dictht結構中table存放的就是buckets的地址 dict dictht實際上就是hash表的核心,但是隻有一個dictht還不夠,比如rehash、遍歷hash等操作,所以redis定義了 一個叫dict的結構以支援字典的各種操作,當dictht需要擴容/縮容時,用來管理dictht的遷移 使用場景:hash的儲存方式類似於關係型資料庫,可以儲存一些物件形式的資訊 4.集合型別(set)
集合型別中,每個元素都是不同的,也就是不能有重複資料,同時集合型別中的資料是無序的。一個集合型別鍵可 以儲存至多232-1個 。集合型別和列表型別的最大的區別是有序性和唯一性 集合型別的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在。由於集合型別在redis內部是使用的值 為空的散列表(hash table),所以這些操作的時間複雜度都是O(1). Set在的底層資料結構以intset或者hashtable來儲存。當set中只包含整數型的元素時,採用intset來儲存,否則, 採用hashtable儲存,但是對於set來說,該hashtable的value值用於為NULL。通過key來儲存元素 使用場景:去重,找標籤,差集 5,有序集合 sorted-set 有序集合型別,和集合型別的區別就是多了有序的功能 在集合型別的基礎上,有序集合型別為集合中的每個元素都關聯了一個分數,這使得我們不僅可以完成插入、刪除 和判斷元素是否存在等集合型別支援的操作,還能獲得分數最高(或最低)的前N個元素、獲得指定分數範圍內的元 素等與分數有關的操作。雖然集合中每個元素都是不同的,但是他們的分數卻可以相同 。 zset型別的資料結構就比較複雜一點,內部是以ziplist或者skiplist+hashtable來實現,這裡面最核心的一個結構就 是skiplist,也就是跳躍表 。