緩存在維基百科的定義是這樣:高速緩存(cache)簡稱緩存,原始意義是指訪問速度比通常隨機存取存儲器(RAM)快的一種RAM。java
撇開這些計算機的概念,所謂緩存,通常都是指內存的訪問性能明顯優於磁盤,咱們把數據放入內存中,能夠提供更快的讀取效率,把數據放入內存中就是緩存。由於在內存中,因此緩存是暫時性的存儲,若是斷電,程序結束等狀況都會讓緩存清空,因此必要狀況下咱們會對緩存作持久化處理,也就是存入硬盤中。mysql
僅此而已,咱們在使用中也是這樣,通常Java中對緩存的應用分爲兩種:應用內緩存和使用緩存應用。redis
應用內緩存就是經過Map或者EHcache(java緩存工具)等手段將數據緩存在JVM內部,這樣的緩存和應用在一個JVM中,會佔據JVM的內存空間,而且緩存間是不可以通訊的。sql
使用緩存應用是指使用memcache ,redis這樣的應用,將應用和緩存分開部署,能夠單機部署也能夠分佈式部署,多個應用可使用同一臺緩存服務器,這樣的緩存應用具備強一致性,高可用等優勢。後端
之因此使用緩存,必定緩存對咱們有了正向的收益,那麼緩存有什麼用呢?在講解緩存的概念的時候咱們說過,緩存可以提升一些數據的訪問速度。而在系統使用緩存也是從效率的角度出發,將一些須要頻繁訪問的數據放置到緩存中,提升查詢的效率,是一種以空間換時間的策略。緩存
在使用中,咱們通常都會選擇Cache+DB的結構,這樣作的好處就是將高頻訪問的數據,放入緩存中,提升系統總體的承載能力,提升了讀寫的能力。服務器
加速讀寫:一般來講加速是明顯的,由於緩存一般都是全內存的系統,然後端(多是mysql、甚至是別人的HTTP, RPC接口)都有速度慢和抗壓能力差的特性,經過緩存的使用能夠有效的提升用戶的訪問速度同時優化了用戶的體驗。session
下降後端負載:經過緩存的添加,若是程序沒有什麼問題,在命中率還能夠的狀況下,能夠幫助後端減小訪問量和複雜計算(join、或者沒法在優化的sql等),在很大程度下降了後端的負載。分佈式
同時使用緩存的缺點也很明顯,會帶來數據不一致性,代碼維護複雜等問題。工具
數據不一致性:不管你的設計作的多麼好,緩存數據與後端數據源必定存在着必定時間窗口的數據不一致性,這個時間窗口的大小可大可小,具體多大還要看一下你的業務容許多大時間窗口的不一致性。
代碼維護成本:加入緩存後,代碼就會在原數據源基礎上加入緩存的相關代碼,例如原來只是一些sql, 如今要加入k-v緩存,必然增長了代碼的維護成本。
複雜開銷大的計算、下降後端負載
以Mysql爲例子,一些複雜的操做或者計算(例如大量聯表操做、一些分組計算),若是不加緩存,大量流量將在這些複雜計算的執行。
加速請求響應
即便單條後端數據足夠快(例如select * from table where id=?),那麼依然能夠利用redis/memcache將這些操做進行merge作優化(例如:cache(select * from table where id in(id1,id10....idK))),從而優化整個IO鏈的相應時間。
一些會被頻繁操做的數據
session的共享會使用redis做爲緩存服務器
我不能保證每個地方都是對的,可是能夠保證每一句話,每一行代碼都是通過推敲和斟酌的。但願每一篇文章背後都是本身追求純粹技術人生的態度。 永遠相信美好的事情即將發生。