新聞中心
Redis的key和value的基礎(chǔ)數(shù)據(jù)類(lèi)型都是字符串類(lèi)型。這種字符串類(lèi)型是一種自定義的數(shù)據(jù)類(lèi)型,simple dynamic string (SDS)。
注:
type country查看的是country(key)對(duì)應(yīng)的value的類(lèi)型為string類(lèi)型,是Redis的五種類(lèi)型,String,List,Hash,Set,ZSet等
object encoding country查看的是country(key)對(duì)應(yīng)的value的內(nèi)存種存儲(chǔ)的類(lèi)型為embsrt,即SDS
type age查看的是age(key)對(duì)應(yīng)的value的類(lèi)型是string類(lèi)型,String,List,Hash,Set,ZSet等
object encoding age查看的是age(key)對(duì)應(yīng)的value的存儲(chǔ)類(lèi)型為int型
Redis字符串并不全都是SDS,也有可能出現(xiàn)C語(yǔ)言的字符串(Redis是由標(biāo)準(zhǔn)C開(kāi)發(fā))。C字符串只有可能出現(xiàn)在字符串“字面常量種”,并且該字符串不能變更。例如:
(1)get命令返回的字符串
(2)設(shè)置日志時(shí)的字符串
Redislog(REDIS_WRINNING,"SDFSDFSDF");
1.2 SDS結(jié)構(gòu)
SDS是一個(gè)結(jié)構(gòu)體,定義在Redis安裝目錄下的src/sds.h中
而C字符串使用len+1長(zhǎng)度的字符數(shù)組來(lái)表示實(shí)際長(zhǎng)度為len的字符串,字符數(shù)組最后以’\0’結(jié)尾,但不能滿足Redis對(duì)于字符串功能性,安全性及高效性的要求。
通過(guò)len字段得到字符串實(shí)際長(zhǎng)度,而無(wú)需遍歷整個(gè)字符串
2.2保障二進(jìn)制安全SDS不以’\0’作為結(jié)束,可以保存圖像,音視頻等數(shù)據(jù)中存在’\0’的情況。而對(duì)于C語(yǔ)言的字符串,需要對(duì)數(shù)據(jù)進(jìn)行限制,或者替換’\0’
2.3減少內(nèi)存再分配次數(shù)對(duì)于C語(yǔ)言字符串來(lái)說(shuō),將兩個(gè)字符數(shù)組拼接(strcat(s1,s2))時(shí)需要重新分配足夠多的新內(nèi)存,這導(dǎo)致了性能的消耗.
SDS采用了空間預(yù)分配策略與惰性空間釋放策略來(lái)避免內(nèi)存再分配問(wèn)題
空間預(yù)分配策略:
每次SDS進(jìn)行空間擴(kuò)展時(shí),程序不但為其分配所需的空間,還會(huì)為其分配額外的未使用的空間,減少內(nèi)存的再分配次數(shù),而額外分配的未使用空間大小取決于空間擴(kuò)展后SDS的len屬性值
1)如果需要分配的額外空間小于1M,則分配未使用的空間大小與len長(zhǎng)度相同
2)如果需要分配的額外空間大于1M,則分配的未使用空間大小固定未1M
惰性空間釋放策略:
SDS字符串長(zhǎng)度如果縮短,那么多出來(lái)的未使用空間將暫時(shí)不釋放,而是增加到free額外空間中 ,以使后期擴(kuò)展SDS時(shí)減少內(nèi)存再分配次數(shù)
Redis中提供了很多的SDS的API,同時(shí)為了兼容C函數(shù),SDS的底層數(shù)據(jù)buf[]中的字符串仍然以空字符串’\0’結(jié)尾
注:比較雙方一個(gè)是SDS,一個(gè)是C字符串,此時(shí)可以通過(guò)C語(yǔ)言函數(shù)
strcmp(sds_str->buf, c_str)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享文章:SDS結(jié)構(gòu)與優(yōu)勢(shì)-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://www.dlmjj.cn/article/dchdds.html