簡(jiǎn)單來(lái)說(shuō),Redis 就是一個(gè)數(shù)據(jù)庫(kù)。
不同于傳統(tǒng)數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在磁盤(pán)中,Redis 將數(shù)據(jù)存在內(nèi)存中,所以它也經(jīng)常被叫做內(nèi)存數(shù)據(jù)庫(kù);同時(shí) Redis 存儲(chǔ)也被叫做 NoSQL 數(shù)據(jù)庫(kù)、非關(guān)系型數(shù)據(jù)庫(kù)。
因?yàn)?Redis 將數(shù)據(jù)保存在內(nèi)存中,所以讀寫(xiě)速度會(huì)非常快,因此 Redis 被廣泛應(yīng)用做緩存或其他需要高速讀寫(xiě)的場(chǎng)景。
為什么要使用 Redis
軟件架構(gòu)中引入 Redis ,是因?yàn)樗坝挚煊謴?qiáng)”。
1. 快,是指性能高
計(jì)算機(jī)硬件的速度由低到高:硬盤(pán)-網(wǎng)絡(luò)-內(nèi)存-CPU;
在傳統(tǒng)的數(shù)據(jù)庫(kù)中,如果第一次訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)中的某條數(shù)據(jù),通常是比較慢的,因?yàn)閿?shù)據(jù)庫(kù)需要從硬盤(pán)上讀取數(shù)據(jù);而 Redis 中的數(shù)據(jù)保存在了內(nèi)存中,所以速度會(huì)比從磁盤(pán)中讀取數(shù)據(jù)快得多。
所以我們經(jīng)常把 Redis 當(dāng)做緩存:第一次從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),并放入 Redis ,后面直接訪(fǎng)問(wèn) Redis 就可以了。
2. 強(qiáng),是指高并發(fā)場(chǎng)景下的穩(wěn)定性(高可用)
在高并發(fā)的場(chǎng)景下,Redis 能夠承受的訪(fǎng)問(wèn)極限,是遠(yuǎn)遠(yuǎn)大于數(shù)據(jù)庫(kù)的,所以我們可以考慮把需要高并發(fā)讀的數(shù)據(jù)放到 Redis 中;
比如秒殺功能,短短幾秒內(nèi)可能就會(huì)有數(shù)十萬(wàn)筆的訪(fǎng)問(wèn),如果直接操作數(shù)據(jù)庫(kù)的話(huà),數(shù)據(jù)庫(kù)可能瞬間就被擊垮了。
哪些場(chǎng)景不適合放入 Redis
當(dāng)然,也不是說(shuō)所有的場(chǎng)景、所有的數(shù)據(jù)都適合放進(jìn) Redis 中,通常我們需要考慮以下幾點(diǎn):
- 數(shù)據(jù)查詢(xún)的命中率高么?如果緩存的命中率很低,沒(méi)有必要放入到 Redis 中;
- 數(shù)據(jù)讀寫(xiě)操作多么?如果數(shù)據(jù)會(huì)被頻繁寫(xiě)入(增、改、刪),設(shè)置寫(xiě)操作次數(shù)大于讀操作次數(shù),那么也沒(méi)有必要使用 Redis ;
- 業(yè)務(wù)數(shù)據(jù)大小如何?如果要儲(chǔ)存文件,那完全沒(méi)有必要放入到 Redis 中。
本地緩存 or Redis
緩存分為本地緩存和分布式緩存:
1. 本地緩存
比如 Guava、Ehcache,甚至把緩存保存到 Map 中,這些都是本地緩存;
本地緩存的特點(diǎn)是輕量、實(shí)現(xiàn)簡(jiǎn)單,生命周期隨著 JVM 的銷(xiāo)毀而結(jié)束;但是如果程序存在多個(gè)實(shí)例(程序部署多套),每個(gè)實(shí)例中的緩存不具有一致性。
2. 分布式緩存
Redis 被稱(chēng)作分布式緩存,如果程序存在多個(gè)實(shí)例,各個(gè)實(shí)例可以共用 Redis 中的緩存數(shù)據(jù),但同時(shí)因?yàn)橐肓?Redis ,那么需要保證 Redis 的高可用,架構(gòu)上更為復(fù)雜。
Redis or Memcached
Memcached 也經(jīng)常被用作緩存,也是分布式緩存的一種,那么它和 Redis 有什么區(qū)別呢?
Redis 支持更豐富的數(shù)據(jù)類(lèi)型,Memcache 支持簡(jiǎn)單的數(shù)據(jù)類(lèi)型String;
Redis 支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存到硬盤(pán)中,重啟之后把數(shù)據(jù)加載到內(nèi)存中,而 Memcache 只是把數(shù)據(jù)保存在內(nèi)存中 ;
Redis 目前支持集群模式,而 Memcached 沒(méi)有原生的集群模式,需要使用方自己實(shí)現(xiàn);
Redis 使用單線(xiàn)程的多路 IO 復(fù)用模型(Redis 在最新的 6.0 版本中開(kāi)始支持多線(xiàn)程);Memcached 使用的是多非阻塞IO復(fù)用的網(wǎng)絡(luò)模型。
最后再?gòu)?qiáng)調(diào)一點(diǎn),是否要引入 Redis?使用本地緩存還是分布式緩存?都需從項(xiàng)目的實(shí)際情況出發(fā);Redis 豐富的數(shù)據(jù)類(lèi)型和對(duì)持久化的支持,會(huì)更加適合我們的項(xiàng)目。