為什么不建議用nosql,為什么不建議用lowe玻璃

為什么要使用nosql

因?yàn)殛P(guān)系數(shù)據(jù)庫(kù)運(yùn)行的慢

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比蓋州網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式蓋州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋蓋州地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

處理大數(shù)據(jù)的大多數(shù)情況是nosql比較高效

但是nosql也沒(méi)法完全取代關(guān)系數(shù)據(jù)庫(kù)

nosql不能處理復(fù)雜的邏輯

但是很多情況下只是簡(jiǎn)單的mapping,匯總,

在目前互聯(lián)網(wǎng)大數(shù)據(jù)的環(huán)境下nosql會(huì)越來(lái)越普及

數(shù)據(jù)多的時(shí)候?yàn)槭裁匆褂胷edis而不用mysql?

通常來(lái)說(shuō),當(dāng)數(shù)據(jù)多、并發(fā)量大的時(shí)候,架構(gòu)中可以引入Redis,幫助提升架構(gòu)的整體性能,減少M(fèi)ysql(或其他數(shù)據(jù)庫(kù))的壓力,但不是使用Redis,就不用MySQL。

因?yàn)镽edis的性能十分優(yōu)越,可以支持每秒十幾萬(wàn)此的讀/寫(xiě)操作,并且它還支持持久化、集群部署、分布式、主從同步等,Redis在高并發(fā)的場(chǎng)景下數(shù)據(jù)的安全和一致性,所以它經(jīng)常用于兩個(gè)場(chǎng)景:

緩存

判斷數(shù)據(jù)是否適合緩存到Redis中,可以從幾個(gè)方面考慮: 會(huì)經(jīng)常查詢么?命中率如何?寫(xiě)操作多么?數(shù)據(jù)大?。?/p>

我們經(jīng)常采用這樣的方式將數(shù)據(jù)刷到Redis中:查詢的請(qǐng)求過(guò)來(lái),現(xiàn)在Redis中查詢,如果查詢不到,就查詢數(shù)據(jù)庫(kù)拿到數(shù)據(jù),再放到緩存中,這樣第二次相同的查詢請(qǐng)求過(guò)來(lái),就可以直接在Redis中拿到數(shù)據(jù);不過(guò)要注意【緩存穿透】的問(wèn)題。

緩存的刷新會(huì)比較復(fù)雜,通常是修改完數(shù)據(jù)庫(kù)之后,還需要對(duì)Redis中的數(shù)據(jù)進(jìn)行操作;代碼很簡(jiǎn)單,但是需要保證這兩步為同一事務(wù),或最終的事務(wù)一致性。

高速讀寫(xiě)

常見(jiàn)的就是計(jì)數(shù)器,比如一篇文章的閱讀量,不可能每一次閱讀就在數(shù)據(jù)庫(kù)里面update一次。

高并發(fā)的場(chǎng)景很適合使用Redis,比如雙11秒殺,庫(kù)存一共就一千件,到了秒殺的時(shí)間,通常會(huì)在極為短暫的時(shí)間內(nèi),有數(shù)萬(wàn)級(jí)的請(qǐng)求達(dá)到服務(wù)器,如果使用數(shù)據(jù)庫(kù)的話,很可能在這一瞬間造成數(shù)據(jù)庫(kù)的崩潰,所以通常會(huì)使用Redis(秒殺的場(chǎng)景會(huì)比較復(fù)雜,Redis只是其中之一,例如如果請(qǐng)求超過(guò)某個(gè)數(shù)量的時(shí)候,多余的請(qǐng)求就會(huì)被限流)。

這種高并發(fā)的場(chǎng)景,是當(dāng)請(qǐng)求達(dá)到服務(wù)器的時(shí)候,直接在Redis上讀寫(xiě),請(qǐng)求不會(huì)訪問(wèn)到數(shù)據(jù)庫(kù);程序會(huì)在合適的時(shí)間,比如一千件庫(kù)存都被秒殺,再將數(shù)據(jù)批量寫(xiě)到數(shù)據(jù)庫(kù)中。

所以通常來(lái)說(shuō),在必要的時(shí)候引入Redis,可以減少M(fèi)ySQL(或其他)數(shù)據(jù)庫(kù)的壓力,兩者不是替代的關(guān)系 。

我將持續(xù)分享Java開(kāi)發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的見(jiàn)解,希望能得到你的關(guān)注。

Redis和MySQL的應(yīng)用場(chǎng)景是不同的。

通常來(lái)說(shuō),沒(méi)有說(shuō)用Redis就不用MySQL的這種情況。

因?yàn)镽edis是一種非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL),而MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)。

和Redis同類的數(shù)據(jù)庫(kù)還有MongoDB和Memchache(其實(shí)并沒(méi)有持久化數(shù)據(jù))

那關(guān)系型數(shù)據(jù)庫(kù)現(xiàn)在常用的一般有MySQL,SQL Server,Oracle。

我們先來(lái)了解一下關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別吧。

1.存儲(chǔ)方式

關(guān)系型數(shù)據(jù)庫(kù)是表格式的,因此存儲(chǔ)在表的行和列中。他們之間很容易關(guān)聯(lián)協(xié)作存儲(chǔ),提取數(shù)據(jù)很方便。而Nosql數(shù)據(jù)庫(kù)則與其相反,他是大塊的組合在一起。通常存儲(chǔ)在數(shù)據(jù)集中,就像文檔、鍵值對(duì)或者圖結(jié)構(gòu)。

2.存儲(chǔ)結(jié)構(gòu)

關(guān)系型數(shù)據(jù)庫(kù)對(duì)應(yīng)的是結(jié)構(gòu)化數(shù)據(jù),數(shù)據(jù)表都預(yù)先定義了結(jié)構(gòu)(列的定義),結(jié)構(gòu)描述了數(shù)據(jù)的形式和內(nèi)容。這一點(diǎn)對(duì)數(shù)據(jù)建模至關(guān)重要,雖然預(yù)定義結(jié)構(gòu)帶來(lái)了可靠性和穩(wěn)定性,但是修改這些數(shù)據(jù)比較困難。而Nosql數(shù)據(jù)庫(kù)基于動(dòng)態(tài)結(jié)構(gòu),使用與非結(jié)構(gòu)化數(shù)據(jù)。因?yàn)镹osql數(shù)據(jù)庫(kù)是動(dòng)態(tài)結(jié)構(gòu),可以很容易適應(yīng)數(shù)據(jù)類型和結(jié)構(gòu)的變化。

3.存儲(chǔ)規(guī)范

關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ)為了更高的規(guī)范性,把數(shù)據(jù)分割為最小的關(guān)系表以避免重復(fù),獲得精簡(jiǎn)的空間利用。雖然管理起來(lái)很清晰,但是單個(gè)操作設(shè)計(jì)到多張表的時(shí)候,數(shù)據(jù)管理就顯得有點(diǎn)麻煩。而Nosql數(shù)據(jù)存儲(chǔ)在平面數(shù)據(jù)集中,數(shù)據(jù)經(jīng)??赡軙?huì)重復(fù)。單個(gè)數(shù)據(jù)庫(kù)很少被分隔開(kāi),而是存儲(chǔ)成了一個(gè)整體,這樣整塊數(shù)據(jù)更加便于讀寫(xiě)

4.存儲(chǔ)擴(kuò)展

這可能是兩者之間最大的區(qū)別,關(guān)系型數(shù)據(jù)庫(kù)是縱向擴(kuò)展,也就是說(shuō)想要提高處理能力,要使用速度更快的計(jì)算機(jī)。因?yàn)閿?shù)據(jù)存儲(chǔ)在關(guān)系表中,操作的性能瓶頸可能涉及到多個(gè)表,需要通過(guò)提升計(jì)算機(jī)性能來(lái)克服。雖然有很大的擴(kuò)展空間,但是最終會(huì)達(dá)到縱向擴(kuò)展的上限。而Nosql數(shù)據(jù)庫(kù)是橫向擴(kuò)展的,它的存儲(chǔ)天然就是分布式的,可以通過(guò)給資源池添加更多的普通數(shù)據(jù)庫(kù)服務(wù)器來(lái)分擔(dān)負(fù)載。

5.查詢方式

關(guān)系型數(shù)據(jù)庫(kù)通過(guò)結(jié)構(gòu)化查詢語(yǔ)言來(lái)操作數(shù)據(jù)庫(kù)(就是我們通常說(shuō)的SQL)。SQL支持?jǐn)?shù)據(jù)庫(kù)CURD操作的功能非常強(qiáng)大,是業(yè)界的標(biāo)準(zhǔn)用法。而Nosql查詢以塊為單元操作數(shù)據(jù),使用的是非結(jié)構(gòu)化查詢語(yǔ)言(UnQl),它是沒(méi)有標(biāo)準(zhǔn)的。關(guān)系型數(shù)據(jù)庫(kù)表中主鍵的概念對(duì)應(yīng)Nosql中存儲(chǔ)文檔的ID。關(guān)系型數(shù)據(jù)庫(kù)使用預(yù)定義優(yōu)化方式(比如索引)來(lái)加快查詢操作,而Nosql更簡(jiǎn)單更精確的數(shù)據(jù)訪問(wèn)模式。

6.事務(wù)

關(guān)系型數(shù)據(jù)庫(kù)遵循ACID規(guī)則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)),而Nosql數(shù)據(jù)庫(kù)遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(wù)(Soft-state )、最終一致性(Eventual Consistency))。由于關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)強(qiáng)一致性,所以對(duì)事務(wù)的支持很好。關(guān)系型數(shù)據(jù)庫(kù)支持對(duì)事務(wù)原子性細(xì)粒度控制,并且易于回滾事務(wù)。而Nosql數(shù)據(jù)庫(kù)是在CAP(一致性、可用性、分區(qū)容忍度)中任選兩項(xiàng),因?yàn)榛诠?jié)點(diǎn)的分布式系統(tǒng)中,很難全部滿足,所以對(duì)事務(wù)的支持不是很好,雖然也可以使用事務(wù),但是并不是Nosql的閃光點(diǎn)。

7.性能

關(guān)系型數(shù)據(jù)庫(kù)為了維護(hù)數(shù)據(jù)的一致性付出了巨大的代價(jià),讀寫(xiě)性能比較差。在面對(duì)高并發(fā)讀寫(xiě)性能非常差,面對(duì)海量數(shù)據(jù)的時(shí)候效率非常低。而Nosql存儲(chǔ)的格式都是key-value類型的,并且存儲(chǔ)在內(nèi)存中,非常容易存儲(chǔ),而且對(duì)于數(shù)據(jù)的 一致性是 弱要求。Nosql無(wú)需sql的解析,提高了讀寫(xiě)性能。

8.授權(quán)方式

大多數(shù)的關(guān)系型數(shù)據(jù)庫(kù)都是付費(fèi)的并且價(jià)格昂貴,成本較大(MySQL是開(kāi)源的,所以應(yīng)用的場(chǎng)景最多),而Nosql數(shù)據(jù)庫(kù)通常都是開(kāi)源的。

所以,在實(shí)際的應(yīng)用環(huán)境中,我們一般會(huì)使用MySQL存儲(chǔ)我們的業(yè)務(wù)過(guò)程中的數(shù)據(jù),因?yàn)檫@些數(shù)據(jù)之間的關(guān)系比較復(fù)雜,我們常常會(huì)需要在查詢一個(gè)表的數(shù)據(jù)時(shí)候,將其他關(guān)系表的數(shù)據(jù)查詢出來(lái),例如,查詢某個(gè)用戶的訂單,那至少是需要用戶表和訂單表的數(shù)據(jù)。

查詢某個(gè)商品的銷售數(shù)據(jù),那可能就會(huì)需要用戶表,訂單表,訂單明細(xì)表,商品表等等。

而在這樣的使用場(chǎng)景中,我們使用Redis來(lái)存儲(chǔ)的話,也就是KeyValue形式存儲(chǔ)的話,其實(shí)并不能滿足我們的需要。

即使Redis的讀取效率再高,我們也沒(méi)法用。

但,對(duì)于某些沒(méi)有關(guān)聯(lián)少,且需要高頻率讀寫(xiě),我們使用Redis就能夠很好的提高整個(gè)體統(tǒng)的并發(fā)能力。

例如商品的庫(kù)存信息,我們雖然在MySQL中會(huì)有這樣的字段,但是我們并不想MySQL的數(shù)據(jù)庫(kù)被高頻的讀寫(xiě),因?yàn)槭褂眠@樣會(huì)導(dǎo)致我的商品表或者庫(kù)存表IO非常高,從而影響整個(gè)體統(tǒng)的效率。

所以,對(duì)于這樣的數(shù)據(jù),且有沒(méi)有什么復(fù)雜邏輯關(guān)系(就只是隸屬于SKU)的數(shù)據(jù),我們就可以放在Redis里面,下單直接在Redis中減掉庫(kù)存,這樣,我們的訂單的并發(fā)能力就能夠提高了。

個(gè)人覺(jué)得應(yīng)該站出來(lái)更正一下,相反的數(shù)據(jù)量大,更不應(yīng)該用redis。

為什么?

因?yàn)閞edis是內(nèi)存型數(shù)據(jù)庫(kù)啊,是放在內(nèi)存里的。

設(shè)想一下,假如你的電腦100G的資料,都用redis來(lái)存儲(chǔ),那么你需要100G以上的內(nèi)存!

使用場(chǎng)景

Redis最明顯的用例之一是將其用作緩存。只是保存熱數(shù)據(jù),或者具有過(guò)期的cache。

例如facebook,使用Memcached來(lái)作為其會(huì)話緩存。

總之,沒(méi)有見(jiàn)過(guò)哪個(gè)大公司數(shù)據(jù)量大了,換掉mysql用redis的。

題主你錯(cuò)了,不是用redis代替MySQL,而是引入redis來(lái)優(yōu)化。

BAT里越來(lái)越多的項(xiàng)目組已經(jīng)采用了redis+MySQL的架構(gòu)來(lái)開(kāi)發(fā)平臺(tái)工具。

如題主所說(shuō),當(dāng)數(shù)據(jù)多的時(shí)候,MySQL的查詢效率會(huì)大打折扣。我們通常默認(rèn)如果查詢的字段包含索引的話,返回是毫秒級(jí)別的。但是在實(shí)際工作中,我曾經(jīng)遇到過(guò)一張包含10個(gè)字段的表,1800萬(wàn)+條數(shù)據(jù),當(dāng)某種場(chǎng)景下,我們不得不根據(jù)一個(gè)未加索引的字段進(jìn)行精確查詢的時(shí)候,單條sql語(yǔ)句的執(zhí)行時(shí)長(zhǎng)有時(shí)能夠達(dá)到2min以上,就更別提如果用like這種模糊查詢的話,其效率將會(huì)多么低下。

我們最開(kāi)始是希望能夠通過(guò)增加索引的方式解決,但是面對(duì)千萬(wàn)級(jí)別的數(shù)據(jù)量,我們也不敢貿(mào)然加索引,因?yàn)橐坏?shù)據(jù)庫(kù)hang住,期間的所有數(shù)據(jù)庫(kù)寫(xiě)入請(qǐng)求都會(huì)被放到等待隊(duì)列中,如果請(qǐng)求是通過(guò)http請(qǐng)求發(fā)過(guò)來(lái)的,很有可能導(dǎo)致服務(wù)發(fā)生分鐘級(jí)別的超時(shí)不響應(yīng)。

經(jīng)過(guò)一番調(diào)研,最終敲定的解決方案是引入redis作為緩存。redis具有運(yùn)行效率高,數(shù)據(jù)查詢速度快,支持多種存儲(chǔ)類型以及事務(wù)等優(yōu)勢(shì),我們把經(jīng)常讀取,而不經(jīng)常改動(dòng)的數(shù)據(jù)放入redis中,服務(wù)器讀取這類數(shù)據(jù)的時(shí)候時(shí)候,直接與redis通信,極大的緩解了MySQL的壓力。

然而,我在上面也說(shuō)了,是redis+MySQL結(jié)合的方式,而不是替代。原因就是redis雖然讀寫(xiě)很快,但是不適合做數(shù)據(jù)持久層,主要原因是使用redis做數(shù)據(jù)落盤是要以效率作為代價(jià)的,即每隔制定的時(shí)間,redis就要去進(jìn)行數(shù)據(jù)備份/落盤,這對(duì)于單線程的它來(lái)說(shuō),勢(shì)必會(huì)因“分心”而影響效率,結(jié)果得不償失。

樓主你好,首先糾正下,數(shù)據(jù)多并不是一定就用Redis,Redis歸屬于NoSQL數(shù)據(jù)庫(kù)中,其特點(diǎn)擁有高性能讀寫(xiě)數(shù)據(jù)速度,主要解決業(yè)務(wù)效率瓶頸。下面就詳細(xì)說(shuō)下Redis的相比MySQL優(yōu)點(diǎn)。( 關(guān)于Redis詳細(xì)了解參見(jiàn)我近期文章: )

讀寫(xiě)異常快

Redis非???,每秒可執(zhí)行大約10萬(wàn)次的讀寫(xiě)速度。

豐富的數(shù)據(jù)類型

Redis支持豐富的數(shù)據(jù)類型,有二進(jìn)制字符串、列表、集合、排序集和散列等等。這使得Redis很容易被用來(lái)解決各種問(wèn)題,因?yàn)槲覀冎滥男﹩?wèn)題可以更好使用地哪些數(shù)據(jù)類型來(lái)處理解決。

原子性

Redis的所有操作都是原子操作,這確保如果兩個(gè)客戶端并發(fā)訪問(wèn),Redis服務(wù)器能接收更新的值。

豐富實(shí)用工具 支持異機(jī)主從復(fù)制

Redis支持主從復(fù)制的配置,它可以實(shí)現(xiàn)主服務(wù)器的完全拷貝。

以上為開(kāi)發(fā)者青睞Redis的主要幾個(gè)可取之處。但是,請(qǐng)注意實(shí)際生產(chǎn)環(huán)境中企業(yè)都是結(jié)合Redis和MySQL的特定進(jìn)行不同應(yīng)用場(chǎng)景的取舍。 如緩存——熱數(shù)據(jù)、計(jì)數(shù)器、消息隊(duì)列(與ActiveMQ,RocketMQ等工具類似)、位操作(大數(shù)據(jù)處理)、分布式鎖與單線程機(jī)制、最新列表(如新聞列表頁(yè)面最新的新聞列表)以及排行榜等等 可以看見(jiàn)Redis大顯身手的場(chǎng)景??墒菍?duì)于嚴(yán)謹(jǐn)?shù)臄?shù)據(jù)準(zhǔn)確度和復(fù)雜的關(guān)系型應(yīng)用MySQL等關(guān)系型數(shù)據(jù)庫(kù)依然不可替。

web應(yīng)用中一般采用MySQL+Redis的方式,web應(yīng)用每次先訪問(wèn)Redis,如果沒(méi)有找到數(shù)據(jù),才去訪問(wèn)MySQL。

本質(zhì)區(qū)別

1、mysql:數(shù)據(jù)放在磁盤 redis:數(shù)據(jù)放在內(nèi)存。

首先要知道m(xù)ysql存儲(chǔ)在磁盤里,redis存儲(chǔ)在內(nèi)存里,redis既可以用來(lái)做持久存儲(chǔ),也可以做緩存,而目前大多數(shù)公司的存儲(chǔ)都是mysql + redis,mysql作為主存儲(chǔ),redis作為輔助存儲(chǔ)被用作緩存,加快訪問(wèn)讀取的速度,提高性能。

使用場(chǎng)景區(qū)別

1、mysql支持sql查詢,可以實(shí)現(xiàn)一些關(guān)聯(lián)的查詢以及統(tǒng)計(jì);

2、redis對(duì)內(nèi)存要求比較高,在有限的條件下不能把所有數(shù)據(jù)都放在redis;

3、mysql偏向于存數(shù)據(jù),redis偏向于快速取數(shù)據(jù),但redis查詢復(fù)雜的表關(guān)系時(shí)不如mysql,所以可以把熱門的數(shù)據(jù)放redis,mysql存基本數(shù)據(jù)。

mysql的運(yùn)行機(jī)制

mysql作為持久化存儲(chǔ)的關(guān)系型數(shù)據(jù)庫(kù),相對(duì)薄弱的地方在于每次請(qǐng)求訪問(wèn)數(shù)據(jù)庫(kù)時(shí),都存在著I/O操作,如果反復(fù)頻繁的訪問(wèn)數(shù)據(jù)庫(kù)。第一:會(huì)在反復(fù)鏈接數(shù)據(jù)庫(kù)上花費(fèi)大量時(shí)間,從而導(dǎo)致運(yùn)行效率過(guò)慢;第二:反復(fù)地訪問(wèn)數(shù)據(jù)庫(kù)也會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的負(fù)載過(guò)高,那么此時(shí)緩存的概念就衍生了出來(lái)。

Redis持久化

由于Redis的數(shù)據(jù)都存放在內(nèi)存中,如果沒(méi)有配置持久化,redis重啟后數(shù)據(jù)就全丟失了,于是需要開(kāi)啟redis的持久化功能,將數(shù)據(jù)保存到磁盤上,當(dāng)redis重啟后,可以從磁盤中恢復(fù)數(shù)據(jù)。redis提供兩種方式進(jìn)行持久化,一種是RDB持久化(原理是將Reids在內(nèi)存中的數(shù)據(jù)庫(kù)記錄定時(shí)dump到磁盤上的RDB持久化),另外一種是AOF(append only file)持久化(原理是將Reids的操作日志以追加的方式寫(xiě)入文件)。

redis是放在內(nèi)存的~!

數(shù)據(jù)量多少絕對(duì)不是選擇redis和mysql的準(zhǔn)則,因?yàn)闊o(wú)論是mysql和redis都可以集群擴(kuò)展,約束它們的只是硬件(即你有沒(méi)有那么多錢搭建上千個(gè)組成的集群),我個(gè)人覺(jué)得數(shù)據(jù)讀取的快慢可能是選擇的標(biāo)準(zhǔn)之一,另外工作中往往是兩者同是使用,因?yàn)閙ysql存儲(chǔ)在硬盤,做持久化存儲(chǔ),而redis存儲(chǔ)在內(nèi)存中做緩存提升效率。

關(guān)系型數(shù)據(jù)庫(kù)是必不可少的,因?yàn)橹挥嘘P(guān)系型數(shù)據(jù)庫(kù)才能提供給你各種各樣的查詢方式。如果有一系列的數(shù)據(jù)會(huì)頻繁的查詢,那么就用redis進(jìn)行非持久化的存儲(chǔ),以供查詢使用,是解決并發(fā)性能問(wèn)題的其中一個(gè)手段

既然有了NoSQL為什么還用MySQL,為什么不直接用nosql來(lái)存數(shù)據(jù)?

關(guān)系型數(shù)據(jù)庫(kù)中的表都是存儲(chǔ)一些格式化的數(shù)據(jù)結(jié)構(gòu),每個(gè)元組字段的組成都一樣,即使不是每個(gè)元組都需要所有的字段,但數(shù)據(jù)庫(kù)會(huì)為每個(gè)元組分配所有的字段,這樣的結(jié)構(gòu)可以便于表與表之間進(jìn)行連接等操作,但從另一個(gè)角度來(lái)說(shuō)它也是關(guān)系型數(shù)據(jù)庫(kù)性能瓶頸的一個(gè)因素。而非關(guān)系型數(shù)據(jù)庫(kù)以鍵值對(duì)存儲(chǔ),它的結(jié)構(gòu)不固定,每一個(gè)元組可以有不一樣的字段,每個(gè)元組可以根據(jù)需要增加一些自己的鍵值對(duì),這樣就不會(huì)局限于固定的結(jié)構(gòu),可以減少一些時(shí)間和空間的開(kāi)銷。

特點(diǎn):

它們可以處理超大量的數(shù)據(jù)。

它們運(yùn)行在便宜的PC服務(wù)器集群上。

它們擊碎了性能瓶頸。

沒(méi)有過(guò)多的操作。

Bootstrap支持

缺點(diǎn):

但是一些人承認(rèn),沒(méi)有正式的官方支持,萬(wàn)一出了差錯(cuò)會(huì)是可怕的,至少很多管理人員是這樣看。

此外,nosql并未形成一定標(biāo)準(zhǔn),各種產(chǎn)品層出不窮,內(nèi)部混亂,各種項(xiàng)目還需時(shí)間來(lái)檢驗(yàn)

為什么要使用NoSQL?NOSQL的優(yōu)勢(shì)

這次的NoSQL專欄系列將先整體介紹NoSQL,然后介紹如何把NoSQL運(yùn)用到自己的項(xiàng)目中合適的場(chǎng)景中,還會(huì)適當(dāng)?shù)胤治鲆恍┏晒Π咐?,希望有成功使用NoSQL經(jīng)驗(yàn)的朋友給我提供一些線索和信息。

NoSQL概念隨著web2.0的快速發(fā)展,非關(guān)系型、分布式數(shù)據(jù)存儲(chǔ)得到了快速的發(fā)展,它們不保證關(guān)系數(shù)據(jù)的ACID特性。NoSQL概念在2009年被提了出來(lái)。NoSQL最常見(jiàn)的解釋是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一詞最早于1998年被用于一個(gè)輕量級(jí)的關(guān)系數(shù)據(jù)庫(kù)的名字。)

NoSQL被我們用得最多的當(dāng)數(shù)key-value存儲(chǔ),當(dāng)然還有其他的文檔型的、列存儲(chǔ)、圖型數(shù)據(jù)庫(kù)、xml數(shù)據(jù)庫(kù)等。在NoSQL概念提出之前,這些數(shù)據(jù)庫(kù)就被用于各種系統(tǒng)當(dāng)中,但是卻很少用于web互聯(lián)網(wǎng)應(yīng)用。比如cdb、qdbm、bdb數(shù)據(jù)庫(kù)。

傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)的瓶頸

傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)具有不錯(cuò)的性能,高穩(wěn)定型,久經(jīng)歷史考驗(yàn),而且使用簡(jiǎn)單,功能強(qiáng)大,同時(shí)也積累了大量的成功案例。在互聯(lián)網(wǎng)領(lǐng)域,MySQL成為了絕對(duì)靠前的王者,毫不夸張的說(shuō),MySQL為互聯(lián)網(wǎng)的發(fā)展做出了卓越的貢獻(xiàn)。

在90年代,一個(gè)網(wǎng)站的訪問(wèn)量一般都不大,用單個(gè)數(shù)據(jù)庫(kù)完全可以輕松應(yīng)付。在那個(gè)時(shí)候,更多的都是靜態(tài)網(wǎng)頁(yè),動(dòng)態(tài)交互類型的網(wǎng)站不多。

到了最近10年,網(wǎng)站開(kāi)始快速發(fā)展。火爆的論壇、博客、sns、微博逐漸引領(lǐng)web領(lǐng)域的潮流。在初期,論壇的流量其實(shí)也不大,如果你接觸網(wǎng)絡(luò)比較早,你可能還記得那個(gè)時(shí)候還有文本型存儲(chǔ)的論壇程序,可以想象一般的論壇的流量有多大。

Memcached+MySQL

后來(lái),隨著訪問(wèn)量的上升,幾乎大部分使用MySQL架構(gòu)的網(wǎng)站在數(shù)據(jù)庫(kù)上都開(kāi)始出現(xiàn)了性能問(wèn)題,web程序不再僅僅專注在功能上,同時(shí)也在追求性能。程序員們開(kāi)始大量的使用緩存技術(shù)來(lái)緩解數(shù)據(jù)庫(kù)的壓力,優(yōu)化數(shù)據(jù)庫(kù)的結(jié)構(gòu)和索引。開(kāi)始比較流行的是通過(guò)文件緩存來(lái)緩解數(shù)據(jù)庫(kù)壓力,但是當(dāng)訪問(wèn)量繼續(xù)增大的時(shí)候,多臺(tái)web機(jī)器通過(guò)文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。在這個(gè)時(shí)候,Memcached就自然的成為一個(gè)非常時(shí)尚的技術(shù)產(chǎn)品。

Memcached作為一個(gè)獨(dú)立的分布式的緩存服務(wù)器,為多個(gè)web服務(wù)器提供了一個(gè)共享的高性能緩存服務(wù),在Memcached服務(wù)器上,又發(fā)展了根據(jù)hash算法來(lái)進(jìn)行多臺(tái)Memcached緩存服務(wù)的擴(kuò)展,然后又出現(xiàn)了一致性hash來(lái)解決增加或減少緩存服務(wù)器導(dǎo)致重新hash帶來(lái)的大量緩存失效的弊端。當(dāng)時(shí),如果你去面試,你說(shuō)你有Memcached經(jīng)驗(yàn),肯定會(huì)加分的。

Mysql主從讀寫(xiě)分離

由于數(shù)據(jù)庫(kù)的寫(xiě)入壓力增加,Memcached只能緩解數(shù)據(jù)庫(kù)的讀取壓力。讀寫(xiě)集中在一個(gè)數(shù)據(jù)庫(kù)上讓數(shù)據(jù)庫(kù)不堪重負(fù),大部分網(wǎng)站開(kāi)始使用主從復(fù)制技術(shù)來(lái)達(dá)到讀寫(xiě)分離,以提高讀寫(xiě)性能和讀庫(kù)的可擴(kuò)展性。Mysql的master-slave模式成為這個(gè)時(shí)候的網(wǎng)站標(biāo)配了。

分表分庫(kù)隨著web2.0的繼續(xù)高速發(fā)展,在Memcached的高速緩存,MySQL的主從復(fù)制,讀寫(xiě)分離的基礎(chǔ)之上,這時(shí)MySQL主庫(kù)的寫(xiě)壓力開(kāi)始出現(xiàn)瓶頸,而數(shù)據(jù)量的持續(xù)猛增,由于MyISAM使用表鎖,在高并發(fā)下會(huì)出現(xiàn)嚴(yán)重的鎖問(wèn)題,大量的高并發(fā)MySQL應(yīng)用開(kāi)始使用InnoDB引擎代替MyISAM。同時(shí),開(kāi)始流行使用分表分庫(kù)來(lái)緩解寫(xiě)壓力和數(shù)據(jù)增長(zhǎng)的擴(kuò)展問(wèn)題。這個(gè)時(shí)候,分表分庫(kù)成了一個(gè)熱門技術(shù),是面試的熱門問(wèn)題也是業(yè)界討論的熱門技術(shù)問(wèn)題。也就在這個(gè)時(shí)候,MySQL推出了還不太穩(wěn)定的表分區(qū),這也給技術(shù)實(shí)力一般的公司帶來(lái)了希望。雖然MySQL推出了MySQL Cluster集群,但是由于在互聯(lián)網(wǎng)幾乎沒(méi)有成功案例,性能也不能滿足互聯(lián)網(wǎng)的要求,只是在高可靠性上提供了非常大的保證。

MySQL的擴(kuò)展性瓶頸

在互聯(lián)網(wǎng),大部分的MySQL都應(yīng)該是IO密集型的,事實(shí)上,如果你的MySQL是個(gè)CPU密集型的話,那么很可能你的MySQL設(shè)計(jì)得有性能問(wèn)題,需要優(yōu)化了。大數(shù)據(jù)量高并發(fā)環(huán)境下的MySQL應(yīng)用開(kāi)發(fā)越來(lái)越復(fù)雜,也越來(lái)越具有技術(shù)挑戰(zhàn)性。分表分庫(kù)的規(guī)則把握都是需要經(jīng)驗(yàn)的。雖然有像淘寶這樣技術(shù)實(shí)力強(qiáng)大的公司開(kāi)發(fā)了透明的中間件層來(lái)屏蔽開(kāi)發(fā)者的復(fù)雜性,但是避免不了整個(gè)架構(gòu)的復(fù)雜性。分庫(kù)分表的子庫(kù)到一定階段又面臨擴(kuò)展問(wèn)題。還有就是需求的變更,可能又需要一種新的分庫(kù)方式。

MySQL數(shù)據(jù)庫(kù)也經(jīng)常存儲(chǔ)一些大文本字段,導(dǎo)致數(shù)據(jù)庫(kù)表非常的大,在做數(shù)據(jù)庫(kù)恢復(fù)的時(shí)候就導(dǎo)致非常的慢,不容易快速恢復(fù)數(shù)據(jù)庫(kù)。比如1000萬(wàn)4KB大小的文本就接近40GB的大小,如果能把這些數(shù)據(jù)從MySQL省去,MySQL將變得非常的小。

關(guān)系數(shù)據(jù)庫(kù)很強(qiáng)大,但是它并不能很好的應(yīng)付所有的應(yīng)用場(chǎng)景。MySQL的擴(kuò)展性差(需要復(fù)雜的技術(shù)來(lái)實(shí)現(xiàn)),大數(shù)據(jù)下IO壓力大,表結(jié)構(gòu)更改困難,正是當(dāng)前使用MySQL的開(kāi)發(fā)人員面臨的問(wèn)題。

NOSQL的優(yōu)勢(shì)易擴(kuò)展NoSQL數(shù)據(jù)庫(kù)種類繁多,但是一個(gè)共同的特點(diǎn)都是去掉關(guān)系數(shù)據(jù)庫(kù)的關(guān)系型特性。數(shù)據(jù)之間無(wú)關(guān)系,這樣就非常容易擴(kuò)展。也無(wú)形之間,在架構(gòu)的層面上帶來(lái)了可擴(kuò)展的能力。

大數(shù)據(jù)量,高性能

NoSQL數(shù)據(jù)庫(kù)都具有非常高的讀寫(xiě)性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無(wú)關(guān)系性,數(shù)據(jù)庫(kù)的結(jié)構(gòu)簡(jiǎn)單。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,在針對(duì)web2.0的交互頻繁的應(yīng)用,Cache性能不高。而NoSQL的Cache是記錄級(jí)的,是一種細(xì)粒度的Cache,所以NoSQL在這個(gè)層面上來(lái)說(shuō)就要性能高很多了。

靈活的數(shù)據(jù)模型

NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。而在關(guān)系數(shù)據(jù)庫(kù)里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡(jiǎn)直就是一個(gè)噩夢(mèng)。這點(diǎn)在大數(shù)據(jù)量的web2.0時(shí)代尤其明顯。

高可用NoSQL在不太影響性能的情況,就可以方便的實(shí)現(xiàn)高可用的架構(gòu)。比如Cassandra,HBase模型,通過(guò)復(fù)制模型也能實(shí)現(xiàn)高可用。

總結(jié)NoSQL數(shù)據(jù)庫(kù)的出現(xiàn),彌補(bǔ)了關(guān)系數(shù)據(jù)(比如MySQL)在某些方面的不足,在某些方面能極大的節(jié)省開(kāi)發(fā)成本和維護(hù)成本。

MySQL和NoSQL都有各自的特點(diǎn)和使用的應(yīng)用場(chǎng)景,兩者的緊密結(jié)合將會(huì)給web2.0的數(shù)據(jù)庫(kù)發(fā)展帶來(lái)新的思路。

為什么不用NoSQL

當(dāng)為大家描述我們的整體服務(wù)架構(gòu)時(shí),最常見(jiàn)的兩個(gè)問(wèn)題是:

為什么采用結(jié)構(gòu)化方式將數(shù)據(jù)存儲(chǔ)在SQL數(shù)據(jù)庫(kù)中,而不使用NoSQL平臺(tái)?

為什么自己維護(hù)數(shù)據(jù)中心,而不將Evernote托管到云服務(wù)提供商?

這兩個(gè)問(wèn)題都很有趣,我們先來(lái)探討第一個(gè)。

對(duì)特定的應(yīng)用而言,相比一個(gè)單一的SQL實(shí)例,一個(gè)現(xiàn)代的鍵值存儲(chǔ)引擎具備顯著的性能優(yōu)勢(shì)和可擴(kuò)展性。

CREATE TABLE notebooks ( id int UNSIGNED NOT NULL PRIMARY KEY, guid binary(16) NOT NULL, user_id int UNSIGNED NOT NULL, name varchar(100) COLLATE utf8_bin NOT NULL, ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE notes ( id int UNSIGNED NOT NULL PRIMARY KEY, guid binary(16) NOT NULL, user_id int UNSIGNED NOT NULL, notebook_id int UNSIGNED NOT NULL, title varchar(255) NOT NULL, ... FOREIGN KEY (notebook_id) REFERENCES notebooks(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如果你在Windows客戶端上創(chuàng)建了一個(gè)名為“Cooking”的記事本,并立即在其中粘貼了一個(gè)名為“Quick Tomato Sauce”的食譜,客戶端會(huì)立刻進(jìn)行如下同步:

調(diào)用NoteStore.createNotebook() 請(qǐng)求服務(wù)器創(chuàng)建記事本,并返回以創(chuàng)建記事本的GUID。

通過(guò)指定記事本的GUID,調(diào)用NoteStore.createNote()在記事本中創(chuàng)建筆記。

每次API調(diào)用都通過(guò)SQL事物予以實(shí)現(xiàn),可以讓客戶端完全信任服務(wù)器的任何提示。ACID兼容的數(shù)據(jù)庫(kù)可以做到這些:

原子性(Atomicity):如果API調(diào)用成功,那么所有的改動(dòng)都會(huì)保存;如果API調(diào)用失敗,所有的改動(dòng)都不會(huì)提交。

一致性(Consistency): 在API調(diào)用完成后,所有的賬戶都可用,并能保證內(nèi)部狀態(tài)的一致性。每篇筆記都與記事本相關(guān)聯(lián),以避免出現(xiàn)孤立項(xiàng)。數(shù)據(jù)庫(kù)不允許刪除關(guān)聯(lián)有記事的記事本,這得感謝FOREIGN KEY約束。

持久性(Durability):當(dāng)服務(wù)器發(fā)送記事本已創(chuàng)建完畢的回執(zhí)后,客戶端會(huì)認(rèn)為它的存在具有持久性,以便進(jìn)行后續(xù)的操作。變更的持久性,可以讓客戶端知道在任何時(shí)刻對(duì)服務(wù)狀態(tài)的影響都能保持一致性。

對(duì)我們的同步協(xié)議而言,持久性最為重要。如果客戶端不能確定服務(wù)器端的變更具有持久性,那么協(xié)議將會(huì)變得復(fù)雜而低效。

“大數(shù)據(jù)”問(wèn)題

得益于事務(wù)處理的數(shù)據(jù)庫(kù)的ACID屬性,同樣使得數(shù)據(jù)集非常難以擴(kuò)展,以超出單臺(tái)服務(wù)器的范圍。數(shù)據(jù)庫(kù)集群和多主復(fù)制技術(shù)并不理想,鍵值存儲(chǔ)為實(shí)現(xiàn)可擴(kuò)展性提供了一條捷徑。

所幸,Evernote暫時(shí)不需要考慮這個(gè)問(wèn)題。即便是我們有近10億的筆記,和近20億的資源文件,這也并不能稱得上是一個(gè)大數(shù)據(jù)集。通過(guò)按用戶分區(qū),它被劃分成了2千萬(wàn)個(gè)獨(dú)立的數(shù)據(jù)集。

我們尚未遇到所謂“大數(shù)據(jù)”引發(fā)的問(wèn)題,倒是遇到了許多“中數(shù)據(jù)”的存儲(chǔ)問(wèn)題,這就是通過(guò)規(guī)整分區(qū)形成的分片存儲(chǔ)架構(gòu)。

也許以后……

我們對(duì)新的存儲(chǔ)系統(tǒng)非常感興趣,非常樂(lè)意應(yīng)用在哪些對(duì)ACID要求不強(qiáng),但確實(shí)需要橫向擴(kuò)展的新項(xiàng)目中。例如,我們的報(bào)告分析系統(tǒng)已經(jīng)逐漸超出了MySQL平臺(tái)的承受力,需要被更快、更先進(jìn)的系統(tǒng)所取代。

我們現(xiàn)在對(duì)以Evernote用戶元數(shù)據(jù)為基礎(chǔ)的MySQL分片存儲(chǔ)頗為滿意,盡管這不會(huì)引起那些IT弄潮兒的興趣。

當(dāng)前文章:為什么不建議用nosql,為什么不建議用lowe玻璃
URL鏈接:http://muchs.cn/article42/phechc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、軟件開(kāi)發(fā)、企業(yè)網(wǎng)站制作、小程序開(kāi)發(fā)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)