目錄
一、Redis數(shù)據(jù)類(lèi)型?
Redis 數(shù)據(jù)類(lèi)型結(jié)構(gòu)簡(jiǎn)單認(rèn)識(shí)
每個(gè)數(shù)據(jù)類(lèi)型具體的編碼方式
1.string?
2.hash
3.list
4.set
5.zset
典中典:記數(shù)字?。。?/p>
6.查看 key 對(duì)應(yīng) value? 的實(shí)際編碼方式
如果本文有幫助到你,不妨給個(gè)三連吧~
一、Redis數(shù)據(jù)類(lèi)型?
Redis 數(shù)據(jù)類(lèi)型結(jié)構(gòu)簡(jiǎn)單認(rèn)識(shí)
Redis 中所有的 key 都是 string 類(lèi)型,不同的是 value 的數(shù)據(jù)類(lèi)型有很多種,接下來(lái)看看幾種常見(jiàn)的類(lèi)型
Redis 底層在實(shí)現(xiàn)上述數(shù)據(jù)類(lèi)型的時(shí)候,會(huì)在源碼層面,針對(duì)上述實(shí)現(xiàn)進(jìn)特定的優(yōu)化,達(dá)到 節(jié)省時(shí)間 / 節(jié)省空間 的效果,也就是說(shuō),內(nèi)部具體實(shí)現(xiàn)的編碼方式,還會(huì)有變數(shù).
例如之前炒的很熱的一個(gè)新聞:“指鼠為鴨”~
鴨脖店,承諾賣(mài)給你的這個(gè)東西吃起來(lái)和鴨脖是一樣的,但是內(nèi)部的數(shù)據(jù)結(jié)構(gòu),是否真的是鴨脖,可能就根據(jù)實(shí)際情況,做出一定的優(yōu)化.
Ps:redis 承諾,這里有個(gè) hash 表,你進(jìn)行 查詢、插入、刪除、操作,都保證 O(1),但是背后的實(shí)現(xiàn)不一定就是標(biāo)準(zhǔn)的 hash 表,可能在特定場(chǎng)景下使用別的數(shù)據(jù)結(jié)構(gòu).
每個(gè)數(shù)據(jù)類(lèi)型具體的編碼方式
同一個(gè)數(shù)據(jù)類(lèi)型,背后的可能的編碼方式是不同的,會(huì)根據(jù)特定場(chǎng)景優(yōu)化(redis 會(huì)自動(dòng)適應(yīng),程序員在使用 redis 的時(shí)候一般感知不到~)
1.string?
string 類(lèi)型內(nèi)部有以下三種編碼方式:
- raw:最基本的字符串,底層就是一個(gè) java 中 byte 類(lèi)型的數(shù)組(C++ 中 char 類(lèi)型的數(shù)組,C++ 中 char 是一個(gè)字節(jié)).
- int:整形類(lèi)型,redis 通常用來(lái)實(shí)現(xiàn) “計(jì)數(shù)”這樣的功能,當(dāng) value 是一個(gè)整數(shù)的時(shí)候,此時(shí) redis 可能直接使用 int 來(lái)保存.
- embstr:針對(duì)短字符串進(jìn)行的特殊優(yōu)化.
2.hash
hash 類(lèi)型內(nèi)部有以下兩種編碼方式:
- hashtable:最基本的哈希表(不是 java 標(biāo)準(zhǔn)庫(kù)中的 HashTable),redis 內(nèi)部對(duì)哈希表的實(shí)現(xiàn)方式和 java 中的哈希表可能不太一樣,當(dāng)時(shí)整體思想都是一樣的(比如對(duì)數(shù)組下的節(jié)點(diǎn)進(jìn)行賦值時(shí),先檢查有沒(méi)有這個(gè)元素,若有就會(huì)直接覆蓋,沒(méi)有就會(huì)看有沒(méi)有 hash 沖突...)
- ziplist:壓縮列表,當(dāng)哈希表里的元素比較少的時(shí)候,就優(yōu)化成了 ziplist 了,能夠節(jié)省空間(壓縮的原因:redis 上有很多 key,可能某些 key 的 value 是 hash,此時(shí)如果 key 特別多,對(duì)應(yīng)的 hash 也特別多,但是每個(gè) hash 又不是特別大的情況下,就盡量去壓縮,讓整體占用內(nèi)存更小了);
3.list
list 類(lèi)型內(nèi)部有以下兩種編碼方式:
- linkedlist:雙向鏈表,當(dāng)一個(gè) list 包含了數(shù)量比較多的元素,又或者 list 中包含的元素都是比較長(zhǎng)的字符串時(shí),Redis就會(huì)使用 linkedlist 作為 list 的底層實(shí)現(xiàn)。
- ziplist:壓縮列表,當(dāng)哈希表里的元素比較少的時(shí)候,就優(yōu)化成了 ziplist 了,能夠節(jié)省空間(壓縮的原因:redis 上有很多 key,可能某些 key 的 value 是 hash,此時(shí)如果 key 特別多,對(duì)應(yīng)的 hash 也特別多,但是每個(gè) hash 又不是特別大的情況下,就盡量去壓縮,讓整體占用內(nèi)存更小了);
Ps:redis 從 3.2 開(kāi)始,引入了新的實(shí)現(xiàn)方式 quicklist,quicklist 就是一個(gè)鏈表,每個(gè)元素又是一個(gè) ziplist,同時(shí)兼顧了 linkedlist 和 ziplist 的優(yōu)點(diǎn),空間和效率都兼顧到了.
4.set
set 類(lèi)型內(nèi)部有以下兩種編碼方式:
- hashtable:最基本的哈希表(不是 java 標(biāo)準(zhǔn)庫(kù)中的 HashTable),redis 內(nèi)部對(duì)哈希表的實(shí)現(xiàn)方式和 java 中的哈希表可能不太一樣,當(dāng)時(shí)整體思想都是一樣的(比如對(duì)數(shù)組下的節(jié)點(diǎn)進(jìn)行賦值時(shí),先檢查有沒(méi)有這個(gè)元素,若有就會(huì)直接覆蓋,沒(méi)有就會(huì)看有沒(méi)有 hash 沖突...)
- intset:是一個(gè)集合中存的都是整數(shù)的結(jié)構(gòu).
5.zset
zset 類(lèi)型內(nèi)部有以下兩種編碼方式:
- skiplist:跳表,類(lèi)似于 leetcode 上的一個(gè)經(jīng)典題目,“復(fù)制帶隨機(jī)指針的鏈表”,跳表也是鏈表,不同于普通的鏈表,每一個(gè)節(jié)點(diǎn)上有多個(gè)指針域,巧妙的搭配這些指針域的指向就可以做到,從跳表上查詢?cè)氐臅r(shí)間復(fù)雜度是 O(logN).
- ziplist:壓縮列表,當(dāng)哈希表里的元素比較少的時(shí)候,就優(yōu)化成了 ziplist 了,能夠節(jié)省空間(壓縮的原因:redis 上有很多 key,可能某些 key 的 value 是 hash,此時(shí)如果 key 特別多,對(duì)應(yīng)的 hash 也特別多,但是每個(gè) hash 又不是特別大的情況下,就盡量去壓縮,讓整體占用內(nèi)存更小了).
典中典:記數(shù)字?。?!
redis 會(huì)根據(jù)當(dāng)前的 實(shí)際情況選擇內(nèi)部的編碼方式,自動(dòng)適應(yīng),那么是否要記住,啥時(shí)候使用啥編碼方式呢?
只記思想,不記數(shù)字?。?!
比如網(wǎng)上可能會(huì)說(shuō):“如果字符串的長(zhǎng)度小于 39 字節(jié)使用 embstr ,超過(guò) 39 字節(jié)使用 raw”。
可能你就會(huì)覺(jué)得,啊,這 39 就是一個(gè)重點(diǎn),但我要告訴你的是,記數(shù)字,沒(méi)有任何意義?。?!
- 數(shù)字都是可配置的.
- 數(shù)字是咋來(lái)的?需要考證清楚!相比于知道數(shù)字,更重要的是知道數(shù)字是怎么得到的,就可以根據(jù)所處的實(shí)際場(chǎng)景,重新得到這樣的數(shù)字.
很多同學(xué)會(huì)陷入“記數(shù)字”的誤區(qū),大多是因?yàn)閷W(xué)校的考試和工作面試差別很大:學(xué)??荚囉袠?biāo)準(zhǔn)答案,而面試中有一部分有標(biāo)準(zhǔn)答案,也有一部分沒(méi)有標(biāo)準(zhǔn)答案,面試官看中的不是答案,而是你解決問(wèn)題的過(guò)程和思路,哪怕是錯(cuò)的,可能看你思維不錯(cuò),也會(huì)留用你~
可能大家記得最多的就是 HashMap 的相關(guān)數(shù)字,比如,鏈表長(zhǎng)度達(dá)到 xx ,就會(huì)變成紅黑樹(shù),負(fù)載因子達(dá)到 xx 就會(huì)觸發(fā)擴(kuò)容,在實(shí)際的工作中,遇到的場(chǎng)景,和上述數(shù)字就不一定合適了,正確的做法是,根據(jù)實(shí)際的測(cè)試結(jié)果,測(cè)試出一個(gè)更合適的數(shù)值,類(lèi)似還有線程池線程數(shù)目設(shè)置成多少這樣的問(wèn)題...?
這些參數(shù)都是很常見(jiàn)的,同時(shí)也是可調(diào)的~
6.查看 key 對(duì)應(yīng) value? 的實(shí)際編碼方式
如果你想了解當(dāng)前場(chǎng)景下,你的 value 到底被優(yōu)化成了何種編碼方式,也是可以通過(guò)以下指令觀察到的~
object encoding key
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-595914.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-595914.html
如果本文有幫助到你,不妨給個(gè)三連吧~
到了這里,關(guān)于深入學(xué)習(xí) Redis - 常用數(shù)據(jù)類(lèi)型,結(jié)構(gòu)認(rèn)識(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!