redis常用資料結構

2021-09-12 10:05:41 字數 1748 閱讀 1644

redis是乙個開源的key-value儲存引擎,它支援string、hash、list、set和sorted set等多種值型別。由於其卓越的效能表現、豐富的資料型別及穩定性,廣泛用於各種需要k/v儲存的場景。甚至在一些分布式快取系統中,也用它作為底層儲存引擎。本文對redis最常用的資料型別進行剖析,從而讓使用者在各自場景下選擇合適的資料型別,從而發揮其最好的優勢。

1、string

string是最常用的一種資料型別,普通的k/v儲存都可以歸為此類,內部由sds.h定義。在型別的設計上,除了包含字元陣列buf,還會額外儲存實際字串的長度以及buf的剩餘空間,從而提供更靈活的管理方式。特別需要提到的是,redis自己管理記憶體,從而自身可以掌握更多關於記憶體的資訊,提高記憶體分配的效能以及作為其它功能的依據。此外,該結構還提供了一些字串相關的操作函式,功能豐富,實現透明,使用方便。

2、hash

hash是乙個string型別的field和value的對映表,由dict.h定義。乙個key可對應多個field,乙個field對應乙個value。將乙個物件儲存為hash型別,較於每個欄位都儲存成string型別更能節省記憶體,並且可以更方便的訪問整個物件。hash內部儲存的value為乙個hashmap,並提供了直接訪問這個map成員的介面。

舉個例子:我們要儲存乙個使用者詳細資訊,就對每個使用者設定乙個userid作為key,而儲存的value包含了包括姓名name,年齡age,生日birth,住址addr等資訊。如果用普通的k/v結構儲存,一般就是userid與value中的每一項組合作為key,而對應的內容作為value。如通過命令

mset user1_name 」張三」 user1_age 18 user1_addr 「杭州」

這種模式,在資料量大的時候,存在明顯的記憶體浪費。而redis提供的hash結構就很好的解決了這個問題。對於上面的例子,通過執行命令hmset user1 name 」張三」 age 18 addr 「杭州」

user1作為key,而name、age、birth等作為屬性。如此,便通過key+field的方式,避免了資料的重複儲存。

提到hash結構,不得不說的是key的衝突解決辦法和雜湊表的擴容方案。在redis中,在衝突發生時,採取的是鏈式衝突解決辦法。另外,redis採用了雙雜湊表結構(ht[2])。簡單來說,就是初始k/v儲存在ht[0]中,當衝突嚴重時,將ht[1]中桶的大小設定為ht[0]的兩倍,並逐步將ht[0]中的元素遷移到ht[1]。等到所有元素都遷移完成後,再將ht[0]與ht[1]交換位址。

3、list

list實現為乙個雙向鍊錶,支援了反向的插入、查詢和遍歷,由adlist.h定義。我們可以通過push,pop操作從鍊錶的頭部或者尾部新增刪除元素。在需要佇列這樣的資料結構時,list能提供非常豐富的介面,廣泛用於緩衝佇列,訊息佇列等應用場景。學過資料結構的朋友,對此肯定不會陌生。

4、set

set集合型別提供的是乙個列表的功能,而且是可以自動去重的。它的內部實現其實是乙個value值為null的hashmap,也正是因此來使得資料去重以及判斷某個成員是否在集合內等其它一些重要介面變的簡單。當某些應用場景需要儲存乙個列表,且不想要重複的資料時,就可以選擇set這個結構來處理。

5、sort set

sort set的功能與set非常相似,只不過它是可以通過使用者提供乙個優先順序引數來實現自動排序的,而set結構不會做自動排序。sort set內部使用hashmap和skiplist來實現資料的有序儲存,保證查詢的效率以及元素有序性。在某些應用場景,比如需要為某個班級的學生根據成績來排序,就可以將優先順序引數設定為成績分數,這樣在插入到這個結構時,就可以實現自動的排序。

redis 常用資料結構

redis支援5種常用的資料型別,這其實是存在很大的歧義。redis裡存的都是二進位制資料,其實就是位元組陣列 byte 這些位元組資料是沒有資料型別的,只有把它們按照合理的格式解碼後,可以變成乙個字串,整數或物件,此時才具有資料型別。因此redis裡的string指的並不是字串,它其實表示的是一種...

Redis中常用的資料結構

redis是一種非關係型資料庫,常用的資料型別主要有五種,分別為string,list,hash,set,zset,那麼他們對應的資料結構分別是什麼呢?顧名思義,字串的資料型別最簡單,就是使用了string,沒有用到複雜的資料結構。列表 list 支援儲存一組資料,對應的資料結構有兩種,一種是壓縮列...

Redis資料結構

字典 dict 是redis裡最核心的資料結構,正如其全稱remote dictionary service所說,redis其實就是乙個字典服務,字典以key value的形式呈現給使用者,key是簡單的字串,而value可以是各種資料結構,比如字串 string 鍊錶 list 集合 set 排序...