一、前言
非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL = Not Only SQL)的產(chǎn)品非常多,常見(jiàn)的有Memcached、Redis、MongoDB等優(yōu)秀開(kāi)源項(xiàng)目,相關(guān)概念和資料網(wǎng)上也非常豐富,不再重復(fù)描述.
Memcache:
1. ?Memcache 只支持簡(jiǎn)單的k/v結(jié)構(gòu)的數(shù)據(jù)。
2. ?Memcache不支持枚舉,不支持持久化和復(fù)制等功能
3.Memcache是多線程的,在多核上能線性擴(kuò)展到每秒處理100,000個(gè)請(qǐng)求
4.Memcache提供了cas命令,可以保證多個(gè)并發(fā)訪問(wèn)操作同一份數(shù)據(jù)的一致性問(wèn)題
5. ? ?Memcache 的數(shù)據(jù)都存儲(chǔ) 內(nèi)存中 所以它根本不會(huì)有磁盤(pán)I/O操作。
6.Memcached使用預(yù)分配的內(nèi)存池的方式,使用slab和大小不同的chunk來(lái)管理內(nèi)存,Item根據(jù)大小選擇合適的chunk存儲(chǔ),內(nèi)存池的方式可以省去申請(qǐng)/釋放內(nèi)存的開(kāi)銷,并且能減小內(nèi)存碎片產(chǎn)生,但這種方式也會(huì)帶來(lái)一定程度上的空間浪費(fèi),并且在內(nèi)存仍然有很大空間時(shí),新的數(shù)據(jù)也可能會(huì)被剔除
新的數(shù)據(jù)也可能會(huì)被剔除,原因可以參考:http://timyang.NET/data/Memcached-lru-evictions/
Redis:
1.Redis支持多種類型數(shù)據(jù) k/v ?,list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ) 還提供了KEYS。
2. ??Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份
3. ??Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤(pán)中,重啟的時(shí)候可以再次加載進(jìn)行使用
4. ??Redis并不是所有的數(shù)據(jù)都一直存儲(chǔ)在內(nèi)存中的,Redis只會(huì)緩存所有的 key的信息,如果Redis發(fā)現(xiàn)內(nèi)存的使用量超過(guò)了某一個(gè)閥值,將觸發(fā)swap的操作,Redis根據(jù)“swappability = age*log(size_in_memory)”計(jì) 算出哪些key對(duì)應(yīng)的value需要swap到磁盤(pán)。然后再將這些key對(duì)應(yīng)的value持久化到磁盤(pán)中,同時(shí)在內(nèi)存中清除.
5. ??從Redis中讀取數(shù)據(jù)的時(shí)候,如果讀取的key對(duì)應(yīng)的value不在內(nèi)存中,那么Redis就需要從swap文件中加載相應(yīng)數(shù)據(jù),然后再返回給請(qǐng)求方。
6. ?Redis提供了事務(wù)的功能,可以保證一串 命令的原子性,中間不會(huì)被任何操作打斷
7. ?Redis使用現(xiàn)場(chǎng)申請(qǐng)內(nèi)存的方式來(lái)存儲(chǔ)數(shù)據(jù),并且很少使用free-list等方式來(lái)優(yōu)化內(nèi)存分配,會(huì)在一定程度上存在內(nèi)存碎片,Redis跟據(jù)存儲(chǔ)命令參數(shù),會(huì)把帶過(guò)期時(shí)間的數(shù)據(jù)單獨(dú)存放在一起,并把它們稱為臨時(shí)數(shù)據(jù),非臨時(shí)數(shù)據(jù)是永遠(yuǎn)不會(huì)被剔除的,即便物理內(nèi)存不夠,導(dǎo)致swap也不會(huì)剔除任何非臨時(shí)數(shù)據(jù)(但會(huì)嘗試剔除部分臨時(shí)數(shù)據(jù)),這點(diǎn)上Redis更適合作為存儲(chǔ)而不是cache。
8. ?Redis除了作為存儲(chǔ)之外還提供了一些其它方面的功能,比如聚合計(jì)算、pubsub(消息,發(fā)布者和監(jiān)聽(tīng)者)、scripting等。
總結(jié):
1.Redis使用最佳方式是全部數(shù)據(jù)in-memory。
2.Redis更多場(chǎng)景是作為Memcached的替代者來(lái)使用。
3.當(dāng)需要除key/value之外的更多數(shù)據(jù)類型支持時(shí),使用Redis更合適。
4.當(dāng)存儲(chǔ)的數(shù)據(jù)不能被剔除時(shí),使用Redis更合適。
Tair :
1.tair 基于redis
2.一個(gè)Tair集群主要包括3個(gè)必選模塊:configserver、dataserver和client,一個(gè)可選模塊:invalidserver。通常情況下,一個(gè)集群中包含2臺(tái)configserver及多臺(tái)dataServer。
兩臺(tái)configserver互為主備并通過(guò)維護(hù)和dataserver之間的心跳獲知集群中存活可用的dataserver,構(gòu)建數(shù)據(jù)在集群中的分布信息(對(duì)照表)。dataserver負(fù)責(zé)數(shù)據(jù)的存儲(chǔ),并按照configserver的指示完成數(shù)據(jù)的復(fù)制和遷移工作
3.支持redis的內(nèi)存存儲(chǔ)結(jié)構(gòu)。支持k/v,list,hash,set等數(shù)據(jù)結(jié)構(gòu)
ConfigServer的功能
1)?通過(guò)維護(hù)和dataserver心跳來(lái)獲知集群中存活節(jié)點(diǎn)的信息
2)?根據(jù)存活節(jié)點(diǎn)的信息來(lái)構(gòu)建數(shù)據(jù)在集群中的分布表。
3)?提供數(shù)據(jù)分布表的查詢服務(wù)。
4)?調(diào)度dataserver之間的數(shù)據(jù)遷移、復(fù)制。
1.1.2?DataServer的功能
1)?提供存儲(chǔ)引擎
2)?接受client的put/get/remove等操作
3)?執(zhí)行數(shù)據(jù)遷移,復(fù)制等
4)?插件:在接受請(qǐng)求的時(shí)候處理一些自定義功能
5)?訪問(wèn)統(tǒng)計(jì)
1.1.3?InvalidServer的功能
1)?接收來(lái)自client的invalid/hide等請(qǐng)求后,對(duì)屬于同一組的集群(雙機(jī)房獨(dú)立集群部署方式)做delete/hide操作,保證同一組集群的一致。
2)?集群斷網(wǎng)之后的,臟數(shù)據(jù)清理。
3)?訪問(wèn)統(tǒng)計(jì)。
1.1.4?client的功能
1)?在應(yīng)用端提供訪問(wèn)Tair集群的接口。
2)?更新并緩存數(shù)據(jù)分布表和invalidserver地址等。
3)?LocalCache,避免過(guò)熱數(shù)據(jù)訪問(wèn)影響tair集群服務(wù)。
4)?流控
2.1.1?Tair緩存使用的場(chǎng)景
1.?數(shù)據(jù)可以以key/value的形式存儲(chǔ)
2.?數(shù)據(jù)可以接受丟失
3.?訪問(wèn)速度要求很高
4.?單個(gè)數(shù)據(jù)大小不是很大,一般在KB級(jí)別
5.?數(shù)據(jù)量很大,并且有較大的增長(zhǎng)可能性
6.?數(shù)據(jù)更新不頻繁
2.1.2?Tair持久化適用的場(chǎng)景
1.?數(shù)據(jù)可以以key/value的形式存儲(chǔ)
2.?數(shù)據(jù)需要持久化
3.?數(shù)據(jù)量很大,并且有較大的增長(zhǎng)可能性
4.?單個(gè)數(shù)據(jù)大小不是很大,一般在KB級(jí)別
5.?數(shù)據(jù)的讀寫(xiě)比例較高
2.2?不適Tair用的場(chǎng)景
1.對(duì)數(shù)據(jù)有查詢需求,比如對(duì)key的模糊查詢,或者根據(jù)value反查詢key等
2.單條數(shù)據(jù)很大
3.讀寫(xiě)比例很低
5.1?tair優(yōu)勢(shì)
a.在分布式集群支持方面tair支持副本,支持多種集群結(jié)構(gòu),如:一機(jī)房一個(gè)集群、雙?????機(jī)房單集群?jiǎn)畏荨㈦p機(jī)房獨(dú)立集群、雙機(jī)房單集群雙份、雙機(jī)房主備集群;
b.對(duì)于讀寫(xiě)性能根據(jù)結(jié)點(diǎn)添加對(duì)線性上升,原因是各個(gè)結(jié)點(diǎn)之間是沒(méi)有關(guān)系,節(jié)點(diǎn)增多相應(yīng)性能提升。
c.高可用比較強(qiáng),任何小于副本數(shù)結(jié)點(diǎn)掛掉,不會(huì)影響正常業(yè)務(wù)。
e.淘寶在多個(gè)實(shí)際應(yīng)用場(chǎng)景應(yīng)用,滿足不同業(yè)務(wù)需求。
F.支持跨機(jī)房數(shù)據(jù)分布。
5.2?tair弱勢(shì)
a.在單節(jié)點(diǎn)的性能比較方面,redis是性能比tair高大概1/5
b.redis目前研究人員比較少,社區(qū)不是很活躍。
5.3?redis優(yōu)勢(shì)
a.在單節(jié)點(diǎn)的性能比較方面,redis是性能比tair高大概1/5
b.redis目前研究人員比較多,社區(qū)比較活躍。
c.在支持多種數(shù)據(jù)結(jié)構(gòu)方面tair沒(méi)有redis支持的全面。
5.4?redis弱勢(shì)
a.目前發(fā)布版不支持分布式,測(cè)試版支持,測(cè)試版對(duì)分布式支持比較弱,是用主備支持高可能,沒(méi)有副本。
b.容災(zāi)性相比tair弱,原因是redis的分布式不支持多副本。