北京商城網(wǎng)站建設(shè)國內(nèi)設(shè)計公司前十名
1.String類型
特征:即存儲字符串的類型,單個字符串存儲量最大不超過512MB
常用業(yè)務(wù)場景:?來存儲JSON序列化之后對象
底層編碼:
int編碼
數(shù)據(jù)結(jié)構(gòu)特點:ptr指針直接指向字符串常量池中對應(yīng)字符串地址,而且數(shù)組中元素只能為數(shù)字
使?要求:每?個字符必須是數(shù)字
EmbStr編碼
數(shù)據(jù)結(jié)構(gòu)特點:采?簡單動態(tài)字符串結(jié)構(gòu),這種結(jié)構(gòu)的特征就在于是?個可擴(kuò)容的字符數(shù)組,由當(dāng)前已使??度字段,當(dāng)前未使??度字段以及?個字符數(shù)組組成。
擴(kuò)容規(guī)則:當(dāng)字符數(shù)組大小小于1MB時,將總長度進(jìn)行翻倍,如果字符數(shù)組大小大于1MB,那么每次增加1MB的長度
使用要求:當(dāng)字符串大小小于32MB時候,采用的編碼
數(shù)據(jù)結(jié)構(gòu)內(nèi)存地址所在:為RedisObject對象后的連續(xù)內(nèi)存
Raw編碼
數(shù)據(jù)結(jié)構(gòu)特點:同樣采用簡單動態(tài)字符串作為數(shù)據(jù)結(jié)構(gòu)
使用要求為當(dāng)字符串大小超過32MB的時候,自動轉(zhuǎn)為RAW編碼
數(shù)據(jù)結(jié)構(gòu)內(nèi)存地址所在:不和RedisObject對象在?起,而是在內(nèi)存中其他隨機(jī)地方
重點:由于EmbStr和Raw編碼中簡單動態(tài)字符串結(jié)構(gòu)(SDS)內(nèi)存地址不同,所以最開始?成String對象的時候,分配內(nèi)存的次數(shù)也不同,由于EmbStr的RedisObject對象和SDS對象是連續(xù)的,所以?起分配內(nèi)存就行,但是raw需要兩次內(nèi)存分配
2.List類型
特征:有序,可重復(fù)列表。每個List類型可以插入(2的32次方)-1個元素
常?業(yè)務(wù)場景
最新與最老數(shù)據(jù)的TOP顯示:由于底層采用雙向鏈表/壓縮列表的方式進(jìn)行存儲,均能獲取頭節(jié)點和尾節(jié)點指針,每個節(jié)點均有前后指針的關(guān)系,非常適合進(jìn)行操作頭部與尾部節(jié)點
消息隊列:即?產(chǎn)者可以使?push方法往List類型的頭部插入信息,然后消費(fèi)者通過pop對List類型的尾部進(jìn)行消費(fèi)
底層編碼:
ZipList編碼
數(shù)據(jù)結(jié)構(gòu)特點:即?段連續(xù)的內(nèi)存數(shù)組,但是和普通的數(shù)組不同,他的每?個元素空間都是根據(jù)其中存儲的元素大小來規(guī)定的,并不是死板的固定大小,并有記錄當(dāng)前最后?個元素位置的指針。
數(shù)據(jù)結(jié)構(gòu)特點:即?段連續(xù)的內(nèi)存數(shù)組,但是和普通的數(shù)組不同,他的每?個元素空間都是根據(jù)其中存儲的元素大小來規(guī)定的,并不是死板的固定大小,使?要求:即當(dāng)每?個元素大小不超過64個字節(jié),總元素個數(shù)不超過512個并有記錄當(dāng)前最后?個元素位置的指針。
數(shù)據(jù)結(jié)構(gòu)內(nèi)存地址所在:作為RedisObject對象后的連續(xù)內(nèi)存,所以?成List對象時,此編碼只?分配?次內(nèi)存
LinkedList編碼
數(shù)據(jù)結(jié)構(gòu)特點:就是雙向鏈表
使?要求:當(dāng)不滿?zipList編碼要求的時候,就會變成LinkedList編碼
數(shù)據(jù)結(jié)構(gòu)內(nèi)存地址所在:不和RedisObject在?起,?是在內(nèi)存中的任意位置
3.Hash類型
特征:每個Hash類型可以存放(2的32次?)-1個鍵值對
常?業(yè)務(wù)場景:購物車的管理,即使??戶id作為key值,?商品id作為field字段,?商品數(shù)量作為value,那么我們可以使?hgetAll指令完成購物?全選,hdel刪除指定商品等等操作
底層編碼:
ZipList編碼
數(shù)據(jù)結(jié)構(gòu)特點:和List類型采?此編碼時運(yùn)?不太?樣,Hash類型會把field-value鍵值對連續(xù)的插?到壓縮列表中,從?完成不同鍵值對的存儲
使?要求:即當(dāng)每?個元素??不超過64個字節(jié),總元素個數(shù)不超過512個
數(shù)據(jù)結(jié)構(gòu)內(nèi)存地址所在:作為RedisObject對象后的連續(xù)內(nèi)存,所以?成List對象時,此編碼只?分配?次內(nèi)存
Hashtable編碼
數(shù)據(jù)結(jié)構(gòu)特點:底層為哈希表數(shù)據(jù)結(jié)構(gòu),?以存儲field-value鍵值對
使?要求:當(dāng)不滿?zipList編碼要求的時候,就會變成LinkedList編碼
4.Set類型
特征:為?序,?不可重復(fù)集合,可以存放(2的32次?)-1個元素
常使?業(yè)務(wù)場景:
元素去重:即?量元素去重操作會占??量CPU資源,那么把這些數(shù)據(jù)存儲到Set類型中,即可完成去重操作
共同好友等:把?個?戶的好友和另?個?戶的好友進(jìn)?交集處理,得到他們的公同好友,然后進(jìn)?推薦
底層編碼:
Inset編碼
數(shù)據(jù)結(jié)構(gòu)特點:即由整型數(shù)組組成的連續(xù)內(nèi)存(此數(shù)組按元素??進(jìn)?排序),但是除了整形數(shù)組外,還有有當(dāng)前數(shù)組包含的元素數(shù)量以及采?整形的編碼,可分為int16,int32,int64.分別是整形數(shù)組中運(yùn)?存放數(shù)值的??
使?要求:元素個數(shù)?于512個,?且集合內(nèi)元素全為數(shù)字
數(shù)據(jù)結(jié)構(gòu)內(nèi)存地址所在:和RedisObject相連的連續(xù)內(nèi)存
HT編碼
數(shù)據(jù)結(jié)構(gòu)特點:由Value值為空的Hashtable結(jié)構(gòu)組成,被稱為字典。
使?要求:當(dāng)不滿?inset編碼要求的時候,就會變成HT編碼
5.ZSet類型
特征:為有序,?不可重復(fù)集合,可以存放(2的32次?)-1個元素
常使?業(yè)務(wù)場景:熱?數(shù)據(jù)TOP排?榜,即利?Zset類型,有序不重復(fù)特點,把重復(fù)的數(shù)據(jù)進(jìn)?去重并且使?score字段排序后,從?到?排序,反序即可得到熱?數(shù)據(jù)TOP排?榜
底層編碼:
ZipList編碼
數(shù)據(jù)結(jié)構(gòu)特點:壓縮列表的另?種使?,即使??個新增的score字段來決定元素在壓縮列表中的位置,默認(rèn)從?到?
使?要求:元素單個??不能超過64字節(jié),壓縮數(shù)組?度不能超過128個元素
數(shù)據(jù)結(jié)構(gòu)內(nèi)存地址所在:和RedisObject相連的連續(xù)內(nèi)存
skipList編碼
數(shù)據(jù)結(jié)構(gòu)特點:通過跳表與Hashtable的集合編碼,利?跳表存儲hash表中的節(jié)點來完成有序,操作主要還是在hash表中,跳表中的??由Score字段來決定
使?要求:當(dāng)不滿?zipList編碼要求的時候,就會變成skipList編碼