簡單來說球及,Redis 就是一個數(shù)據(jù)庫氧骤。
不同于傳統(tǒng)數(shù)據(jù)庫將數(shù)據(jù)保存在磁盤中,Redis 將數(shù)據(jù)存在內(nèi)存中吃引,所以它也經(jīng)常被叫做內(nèi)存數(shù)據(jù)庫语淘;同時 Redis 存儲也被叫做 NoSQL 數(shù)據(jù)庫、非關系型數(shù)據(jù)庫际歼。
因為 Redis 將數(shù)據(jù)保存在內(nèi)存中惶翻,所以讀寫速度會非常快鹅心,因此 Redis 被廣泛應用做緩存或其他需要高速讀寫的場景吕粗。
為什么要使用 Redis
軟件架構中引入 Redis ,是因為它“又快又強”旭愧。
1. 快颅筋,是指性能高
計算機硬件的速度由低到高:硬盤-網(wǎng)絡-內(nèi)存-CPU;
在傳統(tǒng)的數(shù)據(jù)庫中输枯,如果第一次訪問數(shù)據(jù)庫中的某條數(shù)據(jù)议泵,通常是比較慢的,因為數(shù)據(jù)庫需要從硬盤上讀取數(shù)據(jù)桃熄;而 Redis 中的數(shù)據(jù)保存在了內(nèi)存中先口,所以速度會比從磁盤中讀取數(shù)據(jù)快得多。
所以我們經(jīng)常把 Redis 當做緩存:第一次從數(shù)據(jù)庫中讀取數(shù)據(jù),并放入 Redis 碉京,后面直接訪問 Redis 就可以了厢汹。
2. 強,是指高并發(fā)場景下的穩(wěn)定性(高可用)
在高并發(fā)的場景下谐宙,Redis 能夠承受的訪問極限烫葬,是遠遠大于數(shù)據(jù)庫的,所以我們可以考慮把需要高并發(fā)讀的數(shù)據(jù)放到 Redis 中凡蜻;
比如秒殺功能搭综,短短幾秒內(nèi)可能就會有數(shù)十萬筆的訪問,如果直接操作數(shù)據(jù)庫的話划栓,數(shù)據(jù)庫可能瞬間就被擊垮了设凹。
哪些場景不適合放入 Redis
當然,也不是說所有的場景茅姜、所有的數(shù)據(jù)都適合放進 Redis 中,通常我們需要考慮以下幾點:
- 數(shù)據(jù)查詢的命中率高么月匣?如果緩存的命中率很低钻洒,沒有必要放入到 Redis 中;
- 數(shù)據(jù)讀寫操作多么锄开?如果數(shù)據(jù)會被頻繁寫入(增素标、改、刪)萍悴,設置寫操作次數(shù)大于讀操作次數(shù)头遭,那么也沒有必要使用 Redis ;
- 業(yè)務數(shù)據(jù)大小如何癣诱?如果要儲存文件计维,那完全沒有必要放入到 Redis 中。
本地緩存 or Redis
緩存分為本地緩存和分布式緩存:
1. 本地緩存
比如 Guava撕予、Ehcache鲫惶,甚至把緩存保存到 Map 中,這些都是本地緩存实抡;
本地緩存的特點是輕量欠母、實現(xiàn)簡單,生命周期隨著 JVM 的銷毀而結束吆寨;但是如果程序存在多個實例(程序部署多套)赏淌,每個實例中的緩存不具有一致性。
2. 分布式緩存
Redis 被稱作分布式緩存啄清,如果程序存在多個實例六水,各個實例可以共用 Redis 中的緩存數(shù)據(jù),但同時因為引入了 Redis ,那么需要保證 Redis 的高可用缩擂,架構上更為復雜鼠冕。
Redis or Memcached
Memcached 也經(jīng)常被用作緩存,也是分布式緩存的一種胯盯,那么它和 Redis 有什么區(qū)別呢懈费?
Redis 支持更豐富的數(shù)據(jù)類型,Memcache 支持簡單的數(shù)據(jù)類型String博脑;
Redis 支持數(shù)據(jù)的持久化憎乙,可以將內(nèi)存中的數(shù)據(jù)保存到硬盤中,重啟之后把數(shù)據(jù)加載到內(nèi)存中叉趣,而 Memcache 只是把數(shù)據(jù)保存在內(nèi)存中 泞边;
Redis 目前支持集群模式,而 Memcached 沒有原生的集群模式疗杉,需要使用方自己實現(xiàn)阵谚;
Redis 使用單線程的多路 IO 復用模型(Redis 在最新的 6.0 版本中開始支持多線程);Memcached 使用的是多非阻塞IO復用的網(wǎng)絡模型烟具。
最后再強調(diào)一點梢什,是否要引入 Redis?使用本地緩存還是分布式緩存朝聋?都需從項目的實際情況出發(fā)嗡午;Redis 豐富的數(shù)據(jù)類型和對持久化的支持,會更加適合我們的項目冀痕。
會點代碼的大叔 | 文【原創(chuàng)】