{eval=Array;=+count(Array);}
通常來說,當(dāng)數(shù)據(jù)多、并發(fā)量大的時(shí)候,架構(gòu)中可以引入Redis,幫助提升架構(gòu)的整體性能,減少M(fèi)ysql(或其他數(shù)據(jù)庫)的壓力,但不是使用Redis,就不用MySQL。
因?yàn)镽edis的性能十分優(yōu)越,可以支持每秒十幾萬此的讀/寫操作,并且它還支持持久化、集群部署、分布式、主從同步等,Redis在高并發(fā)的場景下數(shù)據(jù)的安全和一致性,所以它經(jīng)常用于兩個(gè)場景:
經(jīng)常會被查詢,但是不經(jīng)常被修改或者刪除的數(shù)據(jù);比如數(shù)據(jù)字典,業(yè)務(wù)數(shù)據(jù)中的熱點(diǎn)數(shù)據(jù);這樣不僅提升查詢效率,還可以減少數(shù)據(jù)庫的壓力;
經(jīng)常被查詢,實(shí)時(shí)性要求不高數(shù)據(jù),比如網(wǎng)站的最新列表、排行榜之類的數(shù)據(jù),只需要定時(shí)統(tǒng)計(jì)一次,然后把統(tǒng)計(jì)結(jié)果放到Redis中提供查詢(請不要使用select top 10 from xxxx)。
判斷數(shù)據(jù)是否適合緩存到Redis中,可以從幾個(gè)方面考慮:會經(jīng)常查詢么?命中率如何?寫操作多么?數(shù)據(jù)大小?
我們經(jīng)常采用這樣的方式將數(shù)據(jù)刷到Redis中:查詢的請求過來,現(xiàn)在Redis中查詢,如果查詢不到,就查詢數(shù)據(jù)庫拿到數(shù)據(jù),再放到緩存中,這樣第二次相同的查詢請求過來,就可以直接在Redis中拿到數(shù)據(jù);不過要注意【緩存穿透】的問題。
緩存的刷新會比較復(fù)雜,通常是修改完數(shù)據(jù)庫之后,還需要對Redis中的數(shù)據(jù)進(jìn)行操作;代碼很簡單,但是需要保證這兩步為同一事務(wù),或最終的事務(wù)一致性。
常見的就是計(jì)數(shù)器,比如一篇文章的閱讀量,不可能每一次閱讀就在數(shù)據(jù)庫里面update一次。
高并發(fā)的場景很適合使用Redis,比如雙11秒殺,庫存一共就一千件,到了秒殺的時(shí)間,通常會在極為短暫的時(shí)間內(nèi),有數(shù)萬級的請求達(dá)到服務(wù)器,如果使用數(shù)據(jù)庫的話,很可能在這一瞬間造成數(shù)據(jù)庫的崩潰,所以通常會使用Redis(秒殺的場景會比較復(fù)雜,Redis只是其中之一,例如如果請求超過某個(gè)數(shù)量的時(shí)候,多余的請求就會被限流)。
這種高并發(fā)的場景,是當(dāng)請求達(dá)到服務(wù)器的時(shí)候,直接在Redis上讀寫,請求不會訪問到數(shù)據(jù)庫;程序會在合適的時(shí)間,比如一千件庫存都被秒殺,再將數(shù)據(jù)批量寫到數(shù)據(jù)庫中。
所以通常來說,在必要的時(shí)候引入Redis,可以減少M(fèi)ySQL(或其他)數(shù)據(jù)庫的壓力,兩者不是替代的關(guān)系。
因?yàn)閞edis是內(nèi)存型數(shù)據(jù)庫啊,是放在內(nèi)存里的。
設(shè)想一下,假如你的電腦100G的資料,都用redis來存儲,那么你需要100G以上的內(nèi)存!
緩存
Redis最明顯的用例之一是將其用作緩存。只是保存熱數(shù)據(jù),或者具有過期的cache。
例如facebook,使用Memcached來作為其會話緩存。
faceboo使用memcached來緩解數(shù)據(jù)庫負(fù),使用超過800臺服務(wù)器為用戶提供超過28 TB的內(nèi)存。
隊(duì)列
排行榜/計(jì)數(shù)
Pub 發(fā)布/ Sub訂閱
總之,沒有見過哪個(gè)大公司數(shù)據(jù)量大了,換掉mysql用redis的。
歡迎關(guān)注,解鎖更多,同步進(jìn)步!
題主你錯(cuò)了,不是用redis代替MySQL,而是引入redis來優(yōu)化。
BAT里越來越多的項(xiàng)目組已經(jīng)采用了redis+MySQL的架構(gòu)來開發(fā)平臺工具。
如題主所說,當(dāng)數(shù)據(jù)多的時(shí)候,MySQL的查詢效率會大打折扣。我們通常默認(rèn)如果查詢的字段包含索引的話,返回是毫秒級別的。但是在實(shí)際工作中,我曾經(jīng)遇到過一張包含10個(gè)字段的表,1800萬+條數(shù)據(jù),當(dāng)某種場景下,我們不得不根據(jù)一個(gè)未加索引的字段進(jìn)行精確查詢的時(shí)候,單條sql語句的執(zhí)行時(shí)長有時(shí)能夠達(dá)到2min以上,就更別提如果用like這種模糊查詢的話,其效率將會多么低下。
我們最開始是希望能夠通過增加索引的方式解決,但是面對千萬級別的數(shù)據(jù)量,我們也不敢貿(mào)然加索引,因?yàn)橐坏?shù)據(jù)庫hang住,期間的所有數(shù)據(jù)庫寫入請求都會被放到等待隊(duì)列中,如果請求是通過http請求發(fā)過來的,很有可能導(dǎo)致服務(wù)發(fā)生分鐘級別的超時(shí)不響應(yīng)。
經(jīng)過一番調(diào)研,最終敲定的解決方案是引入redis作為緩存。redis具有運(yùn)行效率高,數(shù)據(jù)查詢速度快,支持多種存儲類型以及事務(wù)等優(yōu)勢,我們把經(jīng)常讀取,而不經(jīng)常改動的數(shù)據(jù)放入redis中,服務(wù)器讀取這類數(shù)據(jù)的時(shí)候時(shí)候,直接與redis通信,極大的緩解了MySQL的壓力。
然而,我在上面也說了,是redis+MySQL結(jié)合的方式,而不是替代。原因就是redis雖然讀寫很快,但是不適合做數(shù)據(jù)持久層,主要原因是使用redis做數(shù)據(jù)落盤是要以效率作為代價(jià)的,即每隔制定的時(shí)間,redis就要去進(jìn)行數(shù)據(jù)備份/落盤,這對于單線程的它來說,勢必會因“分心”而影響效率,結(jié)果得不償失。
以上就是我的淺見,歡迎各位在下方點(diǎn)贊,留言。
我是蘇蘇思量,來自BAT的java開發(fā)工程師,每天都會分享科技類見聞,歡迎關(guān)注我,與我共同進(jìn)步。
樓主你好,首先糾正下,數(shù)據(jù)多并不是一定就用Redis,Redis歸屬于NoSQL數(shù)據(jù)庫中,其特點(diǎn)擁有高性能讀寫數(shù)據(jù)速度,主要解決業(yè)務(wù)效率瓶頸。下面就詳細(xì)說下Redis的相比MySQL優(yōu)點(diǎn)。(關(guān)于Redis詳細(xì)了解參見我近期文章:https://www.toutiao.com/i6543810796214813187/)
Redis非常快,每秒可執(zhí)行大約10萬次的讀寫速度。
Redis支持豐富的數(shù)據(jù)類型,有二進(jìn)制字符串、列表、集合、排序集和散列等等。這使得Redis很容易被用來解決各種問題,因?yàn)槲覀冎滥男﹩栴}可以更好使用地哪些數(shù)據(jù)類型來處理解決。
Redis的所有操作都是原子操作,這確保如果兩個(gè)客戶端并發(fā)訪問,Redis服務(wù)器能接收更新的值。
Redis是一個(gè)多實(shí)用工具,可用于多種用例,如:緩存,消息隊(duì)列(發(fā)布/訂閱),通知,key值過期等等。
Redis支持主從復(fù)制的配置,它可以實(shí)現(xiàn)主服務(wù)器的完全拷貝。
以上為開發(fā)者青睞Redis的主要幾個(gè)可取之處。但是,請注意實(shí)際生產(chǎn)環(huán)境中企業(yè)都是結(jié)合Redis和MySQL的特定進(jìn)行不同應(yīng)用場景的取舍。如緩存——熱數(shù)據(jù)、計(jì)數(shù)器、消息隊(duì)列(與ActiveMQ,RocketMQ等工具類似)、位操作(大數(shù)據(jù)處理)、分布式鎖與單線程機(jī)制、最新列表(如新聞列表頁面最新的新聞列表)以及排行榜等等可以看見Redis大顯身手的場景。可是對于嚴(yán)謹(jǐn)?shù)臄?shù)據(jù)準(zhǔn)確度和復(fù)雜的關(guān)系型應(yīng)用MySQL等關(guān)系型數(shù)據(jù)庫依然不可替。
更多技術(shù)了解,關(guān)注小伍
web應(yīng)用中一般采用MySQL+Redis的方式,web應(yīng)用每次先訪問Redis,如果沒有找到數(shù)據(jù),才去訪問MySQL。
如何使用redis和mysql要根據(jù)具體業(yè)務(wù)場景去選型。redis和mysql不是一個(gè)類型的產(chǎn)品,應(yīng)用場景也不太一樣,還是要看你的需求來決定。1、mysql:數(shù)據(jù)放在磁盤 redis:數(shù)據(jù)放在內(nèi)存。
2、redis適合放一些頻繁使用,比較熱的數(shù)據(jù),因?yàn)槭欠旁趦?nèi)存中,讀寫速度都非常快,一般會應(yīng)用在下面一些場景。排行榜、計(jì)數(shù)器、消息隊(duì)列推送、好友關(guān)注、粉絲。
首先要知道m(xù)ysql存儲在磁盤里,redis存儲在內(nèi)存里,redis既可以用來做持久存儲,也可以做緩存,而目前大多數(shù)公司的存儲都是mysql + redis,mysql作為主存儲,redis作為輔助存儲被用作緩存,加快訪問讀取的速度,提高性能。
1、mysql支持sql查詢,可以實(shí)現(xiàn)一些關(guān)聯(lián)的查詢以及統(tǒng)計(jì);
2、redis對內(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作為持久化存儲的關(guān)系型數(shù)據(jù)庫,相對薄弱的地方在于每次請求訪問數(shù)據(jù)庫時(shí),都存在著I/O操作,如果反復(fù)頻繁的訪問數(shù)據(jù)庫。第一:會在反復(fù)鏈接數(shù)據(jù)庫上花費(fèi)大量時(shí)間,從而導(dǎo)致運(yùn)行效率過慢;第二:反復(fù)地訪問數(shù)據(jù)庫也會導(dǎo)致數(shù)據(jù)庫的負(fù)載過高,那么此時(shí)緩存的概念就衍生了出來。
由于Redis的數(shù)據(jù)都存放在內(nèi)存中,如果沒有配置持久化,redis重啟后數(shù)據(jù)就全丟失了,于是需要開啟redis的持久化功能,將數(shù)據(jù)保存到磁盤上,當(dāng)redis重啟后,可以從磁盤中恢復(fù)數(shù)據(jù)。redis提供兩種方式進(jìn)行持久化,一種是RDB持久化(原理是將Reids在內(nèi)存中的數(shù)據(jù)庫記錄定時(shí)dump到磁盤上的RDB持久化),另外一種是AOF(append only file)持久化(原理是將Reids的操作日志以追加的方式寫入文件)。
如有不同觀點(diǎn),歡迎發(fā)表評論。如果喜歡我的回答,歡迎“點(diǎn)贊、分享”。
數(shù)據(jù)量多少絕對不是選擇redis和mysql的準(zhǔn)則,因?yàn)闊o論是mysql和redis都可以集群擴(kuò)展,約束它們的只是硬件(即你有沒有那么多錢搭建上千個(gè)組成的集群),我個(gè)人覺得數(shù)據(jù)讀取的快慢可能是選擇的標(biāo)準(zhǔn)之一,另外工作中往往是兩者同是使用,因?yàn)閙ysql存儲在硬盤,做持久化存儲,而redis存儲在內(nèi)存中做緩存提升效率。
Redis和MySQL的應(yīng)用場景是不同的。
通常來說,沒有說用Redis就不用MySQL的這種情況。
因?yàn)镽edis是一種非關(guān)系型數(shù)據(jù)庫(NoSQL),而MySQL是一種關(guān)系型數(shù)據(jù)庫。
和Redis同類的數(shù)據(jù)庫還有MongoDB和Memchache(其實(shí)并沒有持久化數(shù)據(jù))
那關(guān)系型數(shù)據(jù)庫現(xiàn)在常用的一般有MySQL,SQL Server,Oracle。
我們先來了解一下關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的區(qū)別吧。
存儲方式
關(guān)系型數(shù)據(jù)庫是表格式的,因此存儲在表的行和列中。他們之間很容易關(guān)聯(lián)協(xié)作存儲,提取數(shù)據(jù)很方便。而Nosql數(shù)據(jù)庫則與其相反,他是大塊的組合在一起。通常存儲在數(shù)據(jù)集中,就像文檔、鍵值對或者圖結(jié)構(gòu);
關(guān)系型數(shù)據(jù)庫為了維護(hù)數(shù)據(jù)的一致性付出了巨大的代價(jià),讀寫性能比較差。在面對高并發(fā)讀寫性能非常差,面對海量數(shù)據(jù)的時(shí)候效率非常低。而Nosql存儲的格式都是key-value類型的,并且存儲在內(nèi)存中,非常容易存儲,而且對于數(shù)據(jù)的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫性能;
所以,在實(shí)際的應(yīng)用環(huán)境中,我們一般會使用MySQL存儲我們的業(yè)務(wù)過程中的數(shù)據(jù),因?yàn)檫@些數(shù)據(jù)之間的關(guān)系比較復(fù)雜,我們常常會需要在查詢一個(gè)表的數(shù)據(jù)時(shí)候,將其他關(guān)系表的數(shù)據(jù)查詢出來,例如,查詢某個(gè)用戶的訂單,那至少是需要用戶表和訂單表的數(shù)據(jù)。
查詢某個(gè)商品的銷售數(shù)據(jù),那可能就會需要用戶表,訂單表,訂單明細(xì)表,商品表等等。
而在這樣的使用場景中,我們使用Redis來存儲的話,也就是KeyValue形式存儲的話,其實(shí)并不能滿足我們的需要。
即使Redis的讀取效率再高,我們也沒法用。
但,對于某些沒有關(guān)聯(lián)少,且需要高頻率讀寫,我們使用Redis就能夠很好的提高整個(gè)體統(tǒng)的并發(fā)能力。
例如商品的庫存信息,我們雖然在MySQL中會有這樣的字段,但是我們并不想MySQL的數(shù)據(jù)庫被高頻的讀寫,因?yàn)槭褂眠@樣會導(dǎo)致我的商品表或者庫存表IO非常高,從而影響整個(gè)體統(tǒng)的效率。
所以,對于這樣的數(shù)據(jù),且有沒有什么復(fù)雜邏輯關(guān)系(就只是隸屬于SKU)的數(shù)據(jù),我們就可以放在Redis里面,下單直接在Redis中減掉庫存,這樣,我們的訂單的并發(fā)能力就能夠提高了。
沒有說不可以,就怕公司架構(gòu)師、領(lǐng)導(dǎo)、高管有偏見,怕丟數(shù)據(jù)、不安全,其實(shí)技術(shù)牛的公司,完全可以不用MySQL
關(guān)系型數(shù)據(jù)庫是必不可少的,因?yàn)橹挥嘘P(guān)系型數(shù)據(jù)庫才能提供給你各種各樣的查詢方式。如果有一系列的數(shù)據(jù)會頻繁的查詢,那么就用redis進(jìn)行非持久化的存儲,以供查詢使用,是解決并發(fā)性能問題的其中一個(gè)手段
0
回答5
回答0
回答0
回答0
回答10
回答0
回答0
回答0
回答0
回答