Redis 3.0.0正式版發(fā)布,全新的分布式高可用數(shù)據(jù)庫(kù)
Redis 3.0.0 正式版終于到來(lái)了!最重要的新特性是集群(Redis Cluster),提供Redis功能子集(比如不支持多數(shù)據(jù)庫(kù))的分布式、容錯(cuò)的實(shí)現(xiàn)(最多支持1000結(jié)點(diǎn))。
Salvatore 'antirez' Sanfilippo在Google Groups里表示,這是Redis的重要時(shí)刻。“我相信今天的Redis 3.0.0將以某種方式完全改變Redis的面貌。”他強(qiáng)調(diào),人們將認(rèn)識(shí)到Redis是一個(gè)全新的東西,它的自動(dòng)擴(kuò)展、容錯(cuò)和高可用性都大大提高,從此能夠在更大范圍承擔(dān)更關(guān)鍵的任務(wù)。(我總結(jié)一下老大的意思吧:Redis翻開了歷史新的篇章……)
antirez還透露,內(nèi)置的集群功能持續(xù)干了很多年,雖然能找到一些時(shí)間密集開發(fā),但也不時(shí)被其他特性完全打斷,現(xiàn)在終于完成了。他預(yù)計(jì)社區(qū)能用好這些功能,積累必要的經(jīng)驗(yàn),還要一到兩年。
他還說(shuō),Redis 3.0.0實(shí)際上標(biāo)志著一個(gè)新階段和新的開發(fā)模式的開始。以后,大量已經(jīng)開發(fā)的新功能將不再急于進(jìn)入穩(wěn)定版本,實(shí)際上Redis 3.0.0就放棄了很多新功能,回退到2.8,以保證新的穩(wěn)定版本用戶能夠馬上使用。
他在帖子里重點(diǎn)提及的其他更新包括:
- 新的"embedded string"對(duì)象編碼,提升緩存命中率。在某些工作負(fù)載(尤其是管道化的高負(fù)載)下速度大幅提高。
- 大大改進(jìn)了回收鍵的LRU近似算法。
- AOF重寫功能被完全重新開發(fā)了,以減少進(jìn)程最終將積累的緩沖寫入時(shí),由于硬盤速度慢而導(dǎo)致的延遲。
而在發(fā)布聲明中還列出了如下更新(相對(duì)于2.8):
- WAIT command to block waiting for a write to be transmitted to the specified number of slaves.
- MIGRATE connection caching. Much faster keys migraitons.
- MIGARTE new options COPY and REPLACE.
- CLIENT PAUSE command: stop processing client requests for a specified amount of time.
- BITCOUNT performance improvements.
- CONFIG SET accepts memory values in different units (for example you can use "CONFIG SET maxmemory 1gb").
- Redis log format slightly changed reporting in each line the role of the instance (master/slave) or if it's a saving child log.
- INCR performance improvements.
Hacker News上antirez回答了社區(qū)提出的一些問(wèn)題,頗有價(jià)值,整理翻譯如下。
這是不是愚人節(jié)笑話啊?
非也,我們一向有在4月1日發(fā)布的傳統(tǒng)。去年HyperLogLog支持也是4月1日發(fā)布的嘛。而且那次因?yàn)镠yperLogLog名字太科幻,好多人怎么都不肯相信這居然不是愚人節(jié)笑話呢。
再說(shuō),開源軟件嘛,怕什么愚人節(jié),你下載代碼看看不就啥都知道了。
Redis之外還有什么其他更好的選擇啊?
(這問(wèn)題讓antirez怎么答,總不能不謙虛吧。仔細(xì)聽(tīng),他回答得很好。)這得看使用場(chǎng)景,基本上還是就事論事、具體情況具體分析。程序員的本事不就體現(xiàn)在選擇正確的技術(shù),然后在不同情況下優(yōu)化嘛。你要考慮數(shù)據(jù)模型是否匹配所要解決的問(wèn)題,運(yùn)維因素,持久化保證,性能(需要多少個(gè)結(jié)點(diǎn)),可擴(kuò)展性,是否簡(jiǎn)單(搞這么復(fù)雜以后會(huì)不會(huì)老要我來(lái)支持啊),等等。
其他同學(xué)提到了memcached,有人評(píng)論:現(xiàn)在memcached已經(jīng)只相當(dāng)于Redis最簡(jiǎn)單的功能了,只能作為緩存。Redis不僅能緩存,還能承擔(dān)很多存儲(chǔ)任務(wù)。此外還有人提及HyperDex,但其ACID特性實(shí)現(xiàn)Warp是專有的產(chǎn)品。
有了Cluster,Sentinel是不是就廢啦。
還沒(méi)那么快,Sentinel還在與Cluster并行繼續(xù)開發(fā)中。目前單實(shí)例場(chǎng)景下需要HA的話,它還是***選擇。但長(zhǎng)遠(yuǎn)(可能很長(zhǎng)遠(yuǎn)哦)看,我們會(huì)用Cluster解決Sentinel的使用場(chǎng)景,不過(guò)在那之前我們會(huì)很早就告訴大家的。
誰(shuí)能給我更詳細(xì)地講講"embedded string"對(duì)象編碼是啥,它針對(duì)什么工作負(fù)荷?能找到的文檔都太老了。
這事兒簡(jiǎn)單。一般Redis里會(huì)有包含類型字段的對(duì)象結(jié)構(gòu),還有一個(gè)指針指向?qū)嶋H的對(duì)象表示。假設(shè)類型是REDIS_STRING,就得有指針指向一個(gè)"sds"字符串(sds是字符串庫(kù)用的名字)。
現(xiàn)在有了embedded string之后,就提供了一種特殊的字符串對(duì)象,用一個(gè)位置保持對(duì)象結(jié)構(gòu)和字符串本身。這樣內(nèi)存利用更有效,而且能夠大大改進(jìn)內(nèi)存本地性,所以差不多所有使用字符串對(duì)象的東西(字符串,或者比較大的要用字符串對(duì)象作為集合值的集合對(duì)象)性能都更好。
這種特殊字符串只用于小字符串(工作負(fù)荷里大多數(shù)字符串都不大)。
Redis
Redis是一個(gè)開源的高級(jí)key-value(鍵-值)緩存與存儲(chǔ),以高性能著稱。它也常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)槠渲械逆I可以存各種數(shù)據(jù)結(jié)構(gòu)包括字符串、散列、列表、集合、有序集合、位圖和hyperloglog。Redis的出現(xiàn),很大程度補(bǔ)償了memcached這類KV數(shù)據(jù)庫(kù)的不足。不僅可以用于緩存,也可以用于一些場(chǎng)景的存儲(chǔ),在很多情況下是關(guān)系數(shù)據(jù)庫(kù)很好的補(bǔ)充。它提供了Python,Ruby,Erlang,PHP客戶端,使用非常方便。