Redis專題——Redis的數(shù)據(jù)結(jié)構(gòu)

redis有5種對(duì)外公開的數(shù)據(jù)結(jié)構(gòu)蜜宪,它們分別是string(字符串)豹储、hash(哈希)桃漾、list(列表)坏匪、set(集合)、zset(有序集合)撬统,實(shí)際上每種數(shù)據(jù)結(jié)構(gòu)都有多種內(nèi)部編碼實(shí)現(xiàn)适滓,這樣redis就會(huì)在合適的場(chǎng)景選擇合適的內(nèi)部編碼。

redis的5種數(shù)據(jù)結(jié)構(gòu)

可以用type key命令查詢數(shù)據(jù)結(jié)構(gòu)恋追,用object encoding key命令查詢內(nèi)部編碼凭迹。

redis數(shù)據(jù)結(jié)構(gòu)和內(nèi)部編碼

redis這樣設(shè)計(jì)有兩個(gè)好處:

  1. ,可以改進(jìn)內(nèi)部編碼苦囱,而對(duì)外的數(shù)據(jù)結(jié)構(gòu)和命令沒有影響蕊苗,這樣一旦開發(fā)出更優(yōu)秀的內(nèi)部編碼,無需改動(dòng)外部數(shù)據(jù)結(jié)構(gòu)和命令沿彭,符合開閉原則
  2. 多種內(nèi)部編碼實(shí)現(xiàn)可以在不同場(chǎng)景下發(fā)揮各自的優(yōu)勢(shì)

string

string是redis最基礎(chǔ)朽砰、最常用的數(shù)據(jù)結(jié)構(gòu),首先所有key都是string類型喉刘,而且其他幾種數(shù)據(jù)結(jié)構(gòu)都是在字符串類型基礎(chǔ)上構(gòu)建的瞧柔,字符串類型的值實(shí)際可以是字符串(簡(jiǎn)單的字符串、復(fù)雜的字符串(例如JSON睦裳、XML))造锅、數(shù)字(整數(shù)、浮點(diǎn)數(shù))廉邑,甚至是二進(jìn)制(圖片哥蔚、音頻、視頻)蛛蒙,但是值最大不能超過512MB

內(nèi)部編碼

字符串類型的內(nèi)部編碼有3種:

  • int:8個(gè)字節(jié)的長(zhǎng)整型
  • embstr:小于等于39個(gè)字節(jié)的字符串
  • raw:大于39個(gè)字節(jié)的字符串
應(yīng)用場(chǎng)景

string是redis最基本的數(shù)據(jù)結(jié)構(gòu)糙箍,除了提供最基礎(chǔ)的應(yīng)用場(chǎng)景——緩存之外,還可以利用string的內(nèi)部編碼int進(jìn)行計(jì)數(shù)牵祟,例如記錄文章的點(diǎn)贊數(shù)閱讀量等深夯。

優(yōu)化

hash

在Redis中,哈希類型是指鍵值本身又是一個(gè)鍵值對(duì)結(jié)構(gòu),形如key={{field1咕晋,value1}雹拄,...{fieldN,valueN}}

內(nèi)部編碼
  • ziplist(壓縮列表):當(dāng)哈希類型元素個(gè)數(shù)小于hash-max-ziplist-entries配置(默認(rèn)512個(gè))掌呜、同時(shí)所有值都小于hash-max-ziplist-value配置(默認(rèn)64字節(jié))時(shí)滓玖,Redis會(huì)使用ziplist作為哈希的內(nèi)部實(shí)現(xiàn),ziplist使用更加緊湊的結(jié)構(gòu)實(shí)現(xiàn)多個(gè)元素的連續(xù)存儲(chǔ)质蕉,所以在節(jié)省內(nèi)存方面比hashtable更加優(yōu)秀呢撞。

  • hashtable(哈希表):當(dāng)哈希類型無法滿足ziplist的條件時(shí),Redis會(huì)使用hashtable作為哈希的內(nèi)部實(shí)現(xiàn)饰剥,因?yàn)榇藭r(shí)ziplist的讀寫效率會(huì)下降,而hashtable的讀寫時(shí)間復(fù)雜度為O(1)摧阅。

應(yīng)用場(chǎng)景

相比于使用字符串序列化緩存信息汰蓉,哈希類型變得更加直觀,并且在更新操作上會(huì)更加便捷棒卷。所以一般需要頻繁部分更新的緩存信息采用hash數(shù)據(jù)結(jié)構(gòu)顾孽。

優(yōu)化

list

列表(list)類型是用來存儲(chǔ)多個(gè)有序的字符串,比规,列表中的每個(gè)字符串稱為元素(element)若厚,一個(gè)列表最多可以存儲(chǔ)2^{32}-1個(gè)元素。在Redis中蜒什,可以對(duì)列表兩端插入(push)和彈出(pop)测秸,還可以獲取指定范圍的元素列表、獲取指定索引下標(biāo)的元素等灾常。列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu)霎冯,可以充當(dāng)棧和隊(duì)列的角色。

列表兩端插入和彈出操作
子列表獲取钞瀑、刪除等操作

列表類型有兩個(gè)特點(diǎn):

  1. 列表中的元素是有序的沈撞,這就意味著可以通過索引下標(biāo)獲取某個(gè)元素或者某個(gè)范圍內(nèi)的元素列表。
  2. 列表中的元素可以是重復(fù)的雕什。
內(nèi)部編碼
  • ziplist(壓縮列表):當(dāng)列表的元素個(gè)數(shù)小于list-max-ziplist-entries配置(默認(rèn)512個(gè))缠俺,同時(shí)列表中每個(gè)元素的值都小于list-max-ziplist-value配置時(shí)(默認(rèn)64字節(jié)),Redis會(huì)選用ziplist來作為列表的內(nèi)部實(shí)現(xiàn)來減少內(nèi)存的使用贷岸。
  • linkedlist(鏈表):當(dāng)列表類型無法滿足ziplist的條件時(shí)壹士,Redis會(huì)使用linkedlist作為列表的內(nèi)部實(shí)現(xiàn)。
應(yīng)用場(chǎng)景
  • 消息隊(duì)列
    Redis的lpush+brpop命令組合即可實(shí)現(xiàn)阻塞隊(duì)列偿警,生產(chǎn)者客戶端使用lrpush從列表左側(cè)插入元素墓卦,多個(gè)消費(fèi)者客戶端使用brpop命令阻塞式的“搶”列表尾部的元素,多個(gè)客戶端保證了消費(fèi)的負(fù)載均衡和高可用性户敬。

set

集合(set)類型也是用來保存多個(gè)的字符串元素落剪,但和列表類型不一樣的是睁本,集合中不允許有重復(fù)元素,并且集合中的元素是無序的忠怖,不能通過索引下標(biāo)獲取元素呢堰。,一個(gè)集合最多可以存儲(chǔ)2^{32}-1個(gè)元素凡泣。Redis除了支持集合內(nèi)的增刪改查枉疼,同時(shí)還支持多個(gè)集合取交集、并集鞋拟、差集

內(nèi)部編碼
  • intset(整數(shù)集合):當(dāng)集合中的元素都是整數(shù)且元素個(gè)數(shù)小于set-max-intset-entries配置(默認(rèn)512個(gè))時(shí)骂维,Redis會(huì)選用intset來作為集合的內(nèi)部實(shí)現(xiàn),從而減少內(nèi)存的使用贺纲。
  • hashtable(哈希表):當(dāng)集合類型無法滿足intset的條件時(shí)航闺,Redis會(huì)使用hashtable作為集合的內(nèi)部實(shí)現(xiàn)。
應(yīng)用場(chǎng)景

集合類型比較典型的使用場(chǎng)景是標(biāo)簽(tag)猴誊。例如一個(gè)用戶可能對(duì)娛樂潦刃、體育比較感興趣,另一個(gè)用戶可能對(duì)歷史懈叹、新聞比較感興趣乖杠,這些興趣點(diǎn)就是標(biāo)簽。有了這些數(shù)據(jù)就可以得到喜歡同一個(gè)標(biāo)簽的人澄成,以及用戶的共同喜好的標(biāo)簽胧洒,這些數(shù)據(jù)對(duì)于用戶體驗(yàn)以及增強(qiáng)用戶黏度比較重要。例如一個(gè)電子商務(wù)的網(wǎng)站會(huì)對(duì)不同標(biāo)簽的用戶做不同類型的推薦墨状,比如對(duì)數(shù)碼產(chǎn)品比較感興趣的人略荡,在各個(gè)頁面或者通過郵件的形式給他們推薦最新的數(shù)碼產(chǎn)品,通常會(huì)為網(wǎng)站帶來更多的利益歉胶。

優(yōu)化

zset

有序集合它保留了集合不能有重復(fù)成員的特性汛兜,但不同的是,有序集合中的元素可以排序通今。但是它和list列表使用索引下標(biāo)作為排序依據(jù)不同的是粥谬,它給每個(gè)元素設(shè)置一個(gè)分?jǐn)?shù)(score)作為排序的依據(jù)。有序集合提供了獲取指定分?jǐn)?shù)和元素范圍查詢辫塌、計(jì)算成員排名等功能漏策,合理的利用有序集合,能幫助我們?cè)趯?shí)際開發(fā)中解決很多問題臼氨。

內(nèi)部編碼
  • ziplist(壓縮列表):當(dāng)有序集合的元素個(gè)數(shù)小于zset-max-ziplist-entries配置(默認(rèn)128個(gè))掺喻,同時(shí)每個(gè)元素的值都小于zset-max-ziplist-value配置(默認(rèn)64字節(jié))時(shí),Redis會(huì)用ziplist來作為有序集合的內(nèi)部實(shí)現(xiàn),ziplist可以有效減少內(nèi)存的使用感耙。
  • skiplist(跳躍表):當(dāng)ziplist條件不滿足時(shí)褂乍,有序集合會(huì)使用skiplist作為內(nèi)部實(shí)現(xiàn),因?yàn)榇藭r(shí)ziplist的讀寫效率會(huì)下降即硼。
應(yīng)用場(chǎng)景

有序集合比較典型的使用場(chǎng)景就是排行榜系統(tǒng)逃片。例如視頻網(wǎng)站需要對(duì)用戶上傳的視頻做排行榜,榜單的維度可能是多個(gè)方面的:按照時(shí)間只酥、按照播放數(shù)量褥实、按照獲得的贊數(shù)。

參考文獻(xiàn):
《Redis開發(fā)與運(yùn)維》——付磊

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末裂允,一起剝皮案震驚了整個(gè)濱河市损离,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绝编,老刑警劉巖僻澎,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瓮增,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哩俭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門绷跑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凡资,你說我怎么就攤上這事砸捏。” “怎么了隙赁?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵垦藏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我伞访,道長(zhǎng)掂骏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任厚掷,我火速辦了婚禮弟灼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冒黑。我一直安慰自己田绑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布抡爹。 她就那樣靜靜地躺著掩驱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欧穴,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天民逼,我揣著相機(jī)與錄音,去河邊找鬼苔可。 笑死缴挖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的焚辅。 我是一名探鬼主播映屋,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼同蜻!你這毒婦竟也來了棚点?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤湾蔓,失蹤者是張志新(化名)和其女友劉穎瘫析,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體默责,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贬循,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桃序。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杖虾。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖媒熊,靈堂內(nèi)的尸體忽然破棺而出奇适,到底是詐尸還是另有隱情,我是刑警寧澤芦鳍,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布嚷往,位于F島的核電站,受9級(jí)特大地震影響柠衅,放射性物質(zhì)發(fā)生泄漏皮仁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一菲宴、第九天 我趴在偏房一處隱蔽的房頂上張望魂贬。 院中可真熱鬧,春花似錦裙顽、人聲如沸付燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽键科。三九已至闻丑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勋颖,已是汗流浹背嗦嗡。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饭玲,地道東北人侥祭。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茄厘,于是被迫代替她去往敵國(guó)和親矮冬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Redis的內(nèi)存優(yōu)化 聲明:本文內(nèi)容來自《Redis開發(fā)與運(yùn)維》一書第八章次哈,如轉(zhuǎn)載請(qǐng)聲明胎署。 Redis所有的數(shù)據(jù)都...
    meng_philip123閱讀 18,889評(píng)論 2 29
  • 參考來源 Redis的內(nèi)存優(yōu)化 Redis所有的數(shù)據(jù)都在內(nèi)存中,而內(nèi)存又是非常寶貴的資源窑滞。對(duì)于如何優(yōu)化內(nèi)存使用一直...
    秦漢郵俠閱讀 1,290評(píng)論 0 2
  • Redis 是一個(gè)鍵值對(duì)數(shù)據(jù)庫(key-value DB)琼牧,數(shù)據(jù)庫的值可以是字符串、集合哀卫、列表等多種類型的對(duì)象巨坊,而...
    吳昂_ff2d閱讀 3,203評(píng)論 0 5
  • 聲明:本文內(nèi)容來自《Redis開發(fā)與運(yùn)維》一書第八章,如轉(zhuǎn)載請(qǐng)聲明此改。Redis所有的數(shù)據(jù)都在內(nèi)存中趾撵,而內(nèi)存又是非常...
    yoqu閱讀 1,500評(píng)論 0 2
  • 張小麗坐在21路上,翹著二郎腿带斑,嘴里吹著口香糖鼓寺,手里玩著手機(jī)勋拟,時(shí)間過得非逞模快,轉(zhuǎn)眼間到了張曉麗的小區(qū)門口敢靡,可是張小...
    莉莉_a6c8閱讀 117評(píng)論 1 0