前言
當(dāng)結(jié)束JAVA和數(shù)據(jù)庫的學(xué)習(xí)以后,你就會接觸到redis這個詞,我第一次聽到的時候腦海里就會浮現(xiàn)這兩個問題:
什么是Redis?為什么我們要用Redis?
我了解完以后,寫出來幫助大家能夠更快的認識它。
我們先來看它的定義:
Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。
換句話說,Redis就像是一個HashMap,不過不是在JVM中運行,而是以一個獨立進程的形式運行。
一般說來,會被當(dāng)作緩存使用。 因為它比數(shù)據(jù)庫(MySQL)快,所以常用的數(shù)據(jù),可以考慮放在這里,這樣就提高了性能。
總歸一個字:快!
快在哪里呢?
這個問題在大并發(fā),高負載的網(wǎng)站中必須考慮.redis數(shù)據(jù)庫中的所有數(shù)據(jù)都存儲在內(nèi)存中。由于內(nèi)存的讀寫速度遠快于硬盤,因此Redis的的的在性能上對比其他基于硬盤存儲的數(shù)據(jù)庫有非常明顯的優(yōu)勢。
項目中使用Redis的的的,主要是從兩個角度去考慮:性能狀語從句:并發(fā)。當(dāng)然,Redis的的的還具備可以做分布式鎖等其他功能,但是如果只是為了分布式鎖這些其他功能,完全還有其他中間件代替,并不是非要使用Redis的的的。因此,這個問題主要從性能和并發(fā)兩個角度去答。
1.性能:
我們在碰到需要執(zhí)行耗時特別久,且結(jié)果不頻繁變動的SQL,就特別適合將運行結(jié)果放入緩存,這樣,后面的請求就去緩存中讀取,請求使得能夠迅速響應(yīng)。
2.并發(fā)
在大并發(fā)的情況下,所有的請求直接訪問數(shù)據(jù)庫,數(shù)據(jù)庫會出現(xiàn)連接異常。這個時候,就需要使用的的Redis的做一個緩沖操作,讓請求先訪問到的Redis的的,而不是直接訪問數(shù)據(jù)庫。
redis的優(yōu)勢
1,運行在內(nèi)存,速度快官方號稱支持并發(fā)11瓦特讀操作,并發(fā)8瓦特寫操作,可以說是相當(dāng)彪悍了。
2,數(shù)據(jù)雖在內(nèi)存,但是提供了持久化的支持,即可以將內(nèi)存中的數(shù)據(jù)異步寫入到硬盤中,同時不影響繼續(xù)提供服務(wù)
3,支持數(shù)據(jù)結(jié)構(gòu)豐富(string(字符串),list(鏈表),set(集合),zset(sorted set - 有序集合))和Hash(哈希類型,md5加密出來的那個串)
注意與補充
Redis的缺點
是數(shù)據(jù)庫容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運算上。Redis受限于特定的場景,專注于特定的領(lǐng)域之下,速度相當(dāng)之快,目前還未找到能替代使用產(chǎn)品。
Redis不是什么?從兩個方面來做下對比
1. 不是sql server、mySQL等關(guān)系型數(shù)據(jù)庫,主要原因是:
redis目前還只能作為小數(shù)據(jù)量存儲(全部數(shù)據(jù)能夠加載在內(nèi)存中) ,海量數(shù)據(jù)存儲方面并不是redis所擅長的領(lǐng)域。
設(shè)計、實現(xiàn)方法很不一樣.關(guān)系型數(shù)據(jù)庫通過表來存儲數(shù)據(jù),通過SQL來查詢數(shù)據(jù)。而Redis通上述五種數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù),通過命令 來查詢數(shù)據(jù)。
2. 不是Memcached等緩存系統(tǒng),主要原因有以下幾個:
- 網(wǎng)絡(luò)IO模型方面:Memcached是多線程,分為監(jiān)聽線程、worker線程,引入鎖,帶來了性能損耗。Redis使用單線程的IO復(fù)用模型,將速度優(yōu)勢發(fā)揮到最大,也提供了較簡單的計算功能。
- 內(nèi)存管理方面:Memcached使用預(yù)分配的內(nèi)存池的方式,帶來一定程度的空間浪費 并且在內(nèi)存仍然有很大空間時,新的數(shù)據(jù)也可能會被剔除,而Redis使用現(xiàn)場申請內(nèi)存的方式來存儲數(shù)據(jù),不會剔除任何非臨時數(shù)據(jù) Redis更適合作為存儲而不是cache。
- 數(shù)據(jù)的一致性方面:Memcached提供了cas命令來保證.而Redis提供了事務(wù)的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。
- 存儲方式方面:Memcached只支持簡單的key-value存儲,不支持枚舉,不支持持久化和復(fù)制等功能。
一句話小結(jié):Redis是一個高性能的key-value數(shù)據(jù)庫。 redis的出現(xiàn),很大程度補償了memcached這類key/value存儲的不足,在部分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補充作用。