GuavaMemcached和Redis?
簡單來說,Redis 就是一個數(shù)據(jù)庫。
不同于傳統(tǒng)數(shù)據(jù)庫將數(shù)據(jù)保存在磁盤中,Redis 將數(shù)據(jù)存在內存中,所以它也經(jīng)常被叫做內存數(shù)據(jù)庫;同時 Redis 存儲也被叫做 NoSQL 數(shù)據(jù)庫、非關系型數(shù)據(jù)庫。
因為 Redis 將數(shù)據(jù)保存在內存中,所以讀寫速度會非??欤虼?Redis 被廣泛應用做緩存或其他需要高速讀寫的場景。
為什么要使用 Redis軟件架構中引入 Redis ,是因為它“又快又強”。
1. 快,是指性能高
計算機硬件的速度由低到高:硬盤-網(wǎng)絡-內存-CPU;
在傳統(tǒng)的數(shù)據(jù)庫中,如果第一次訪問數(shù)據(jù)庫中的某條數(shù)據(jù),通常是比較慢的,因為數(shù)據(jù)庫需要從硬盤上讀取數(shù)據(jù);而 Redis 中的數(shù)據(jù)保存在了內存中,所以速度會比從磁盤中讀取數(shù)據(jù)快得多。
所以我們經(jīng)常把 Redis 當做緩存:第一次從數(shù)據(jù)庫中讀取數(shù)據(jù),并放入 Redis ,后面直接訪問 Redis 就可以了。
2. 強,是指高并發(fā)場景下的穩(wěn)定性(高可用)
在高并發(fā)的場景下,Redis 能夠承受的訪問極限,是遠遠大于數(shù)據(jù)庫的,所以我們可以考慮把需要高并發(fā)讀的數(shù)據(jù)放到 Redis 中;
比如秒殺功能,短短幾秒內可能就會有數(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 MemcachedMemcached 也經(jīng)常被用作緩存,也是分布式緩存的一種,那么它和 Redis 有什么區(qū)別呢?
Redis 支持更豐富的數(shù)據(jù)類型,Memcache 支持簡單的數(shù)據(jù)類型String;
Redis 支持數(shù)據(jù)的持久化,可以將內存中的數(shù)據(jù)保存到硬盤中,重啟之后把數(shù)據(jù)加載到內存中,而 Memcache 只是把數(shù)據(jù)保存在內存中 ;
Redis 目前支持集群模式,而 Memcached 沒有原生的集群模式,需要使用方自己實現(xiàn);
Redis 使用單線程的多路 IO 復用模型(Redis 在最新的 6.0 版本中開始支持多線程);Memcached 使用的是多非阻塞IO復用的網(wǎng)絡模型。
最后再強調一點,是否要引入 Redis?使用本地緩存還是分布式緩存?都需從項目的實際情況出發(fā);Redis 豐富的數(shù)據(jù)類型和對持久化的支持,會更加適合我們的項目。
我將持續(xù)分享Java開發(fā)、架構設計、程序員職業(yè)發(fā)展等方面的見解,希望能得到你的關注;關注我后,可私信發(fā)送數(shù)字【1】,獲取海量學習資料。