一、redis和平常寫的數(shù)據(jù)結(jié)構(gòu)的區(qū)別
最大的區(qū)別,redis 作為緩存組件,可以獨(dú)立部署。這也是為什么本地內(nèi)存很快,但還是要用 redis 這類緩存的原因。Redis是基于c語(yǔ)言編寫的開(kāi)源非關(guān)系型內(nèi)存數(shù)據(jù)庫(kù),可以用作數(shù)據(jù)庫(kù)、緩存、消息中間件。
redis是一個(gè)開(kāi)源的使用C語(yǔ)言編寫的一個(gè)kv存儲(chǔ)系統(tǒng),是一個(gè)速度非??斓姆顷P(guān)系遠(yuǎn)程內(nèi)存數(shù)據(jù)庫(kù)。它支持包括String、List、Set、Zset、hash五種數(shù)據(jù)結(jié)構(gòu)。除此之外,通過(guò)復(fù)制、持久化和客戶端分片等特性,用戶可以很方便地將redis擴(kuò)展成一個(gè)能夠包含數(shù)百GB數(shù)據(jù)和每秒處理上百萬(wàn)次的請(qǐng)求的系統(tǒng)。目前支持多種語(yǔ)言的api,方便用戶使用。
redis同時(shí)也內(nèi)置了事務(wù)、LUA腳本、復(fù)制等功能,提供兩種持久化選項(xiàng),一種是每隔一段時(shí)間將數(shù)據(jù)導(dǎo)入到磁盤(快照模式),另一種是追加命令到日志中(AOF模式)。如果只是作為高效的內(nèi)存數(shù)據(jù)庫(kù)使用也可以關(guān)閉持久化功能。通過(guò)哨兵(sentinel)和自動(dòng)分區(qū)(Cuuster)的方式可以提高redis服務(wù)器的高可用性。
與關(guān)系型數(shù)據(jù)庫(kù)相比,redis的命令請(qǐng)求不需要經(jīng)過(guò)查詢分析器或查詢優(yōu)化器進(jìn)行處理,也避免了更新數(shù)據(jù)時(shí)引起的隨機(jī)讀\寫,這些慢操作。它直接讀寫內(nèi)存中的數(shù)據(jù),并且數(shù)據(jù)是按照一定的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的。所以它的速度非常快。
延伸閱讀:
二、字符串(String)
與其它編程語(yǔ)言或其它鍵值存儲(chǔ)提供的字符串非常相似,鍵(key)——值(value) (字符串格式),字符串擁有一些操作命令,如:get set del 還有一些比如自增或自減操作等等。redis是使用C語(yǔ)言開(kāi)發(fā),但C中并沒(méi)有字符串類型,只能使用指針或符數(shù)組的形式表示一個(gè)字符串,所以redis設(shè)計(jì)了一種簡(jiǎn)單動(dòng)態(tài)字符串(SDS[Simple Dynamic String])作為底實(shí)現(xiàn):
定義SDS對(duì)象,此對(duì)象中包含三個(gè)屬性:
len buf中已經(jīng)占有的長(zhǎng)度(表示此字符串的實(shí)際長(zhǎng)度)
free buf中未使用的緩沖區(qū)長(zhǎng)度
buf[] 實(shí)際保存字符串?dāng)?shù)據(jù)的地方
所以取字符串的長(zhǎng)度的時(shí)間復(fù)雜度為O(1),另,buf[]中依然采用了C語(yǔ)言的以\0結(jié)尾可以直接使用C語(yǔ)言的部分標(biāo)準(zhǔn)C字符串庫(kù)函數(shù)。
空間分配原則:當(dāng)len小于IMB(1024*1024)時(shí)增加字符串分配空間大小為原來(lái)的2倍,當(dāng)len大于等于1M時(shí)每次分配 額外多分配1M的空間。