什么是本地緩存、分布式緩存以及多級緩存?
像MySql等傳統的關系型數據庫已經不能適用于所有的業務場景,比如電商系統的秒殺場景,APP首頁的訪問流量高峰場景,很容易造成關系型數據庫的癱瘓,隨著緩存技術的出現很好的解決了這題。
一、緩存的概念(什么是緩存)
緩存就是把訪問量較高的熱點數據從傳統的關系型數據庫中加載到內存中,當用戶再次訪問熱點數據時是從內存中加載,減少了對數據庫的訪問量,解決了高并發場景下容易造成數據庫宕機的問題。
二、為什么要用緩存(為什么要用redis作為緩存)
針對于這個問題要從兩個方面去考慮,一個是應用系統的高并發場景,另一個就是應用系統的高性能情況。
1、高性能情況: 用戶第一次訪問數據時,緩存中沒有數據,要從數據庫中獲取數據,因為是從磁盤中拿數據,讀取數據的過程比較慢。拿到數據后將數據存儲在緩存中,用戶第二次訪問數據時,可以從緩存中直接獲取,因為緩存是直接操作內存的,訪問數據速度比較快。
2、高并發場景下: 操作緩存能夠承受的并發訪問量是遠遠大于訪問數據庫的,比如redis,它的讀的速度是110000次/s,寫的速度是81000次/s。所以說將數據庫中訪問量高的數據存儲到緩存中,用戶請求的時候直接訪問數據庫,不必訪問數據庫,提高應用程序的并發量。
三、緩存的分類有哪些
緩存基本上分為三類:本地緩存、分布式緩存、多級緩存。根據緩存和應用程序是否屬于同一個進程,將緩存分為本地緩存和分布式緩存。基于本地緩存和分布式緩存都有各自的優點和缺點,后面又出現了多級緩存的概念。
1、本地緩存
本地緩存的概念:
本地緩存是指和應用程序在同一個進程內的內存空間去存儲數據,數據的讀寫都是在同一個進程內完成的。
本地緩存優點:
讀取速度快,但是不能進行大數據量存儲。
本地緩存不需要遠程網絡請求去操作內存空間,沒有額外的性能消耗,所以讀取速度快。
本地緩存缺點:
應用程序集群部署時,會存在數據更新問題(數據更新不一致)
本地緩存一般只能被同一個應用進程的程序訪問,不能被其他應用程序進程訪問。在單體應用集群部署時,如果數據庫有數據需要更新,就要同步更新不同服務器節點上的本地緩存的數據來保證數據的一致性,但是這種操作的復雜度高,容易出錯。可以基于redis的發布/訂閱機制來實現各個部署節點的數據同步更新。
數據會隨著應用程序的重啟而丟失
因為本地緩存的數據是存儲在應用進程的內存空間的,所以當應用進程重啟時,本地緩存的數據會丟失。
本地緩存的實現:
(1)、緩存存儲的數據一般都是key-value鍵值對的數據結構。
(2)、除了上面說的實現方式以外,也可以用Guava、Ehcache以及Caffeine等封裝好的工具包來實現本地緩存。
2、分布式緩存
分布式緩存概念:
分布式緩存是獨立部署的服務進程,并且和應用程序沒有部署在同一臺服務器上。所以是需要通過遠程網絡請求來完成分布式緩存的讀寫操作,并且分布式緩存主要應用在應用程序集群部署的環境下。
分布式緩存優點:
支持大數據量存儲
分布式緩存是獨立部署的進程,擁有自身獨自的內存空間,不需要占用應用程序進程的內存空間,并且還支持橫向擴展的集群方式部署,所以可以進行大數據量存儲。
數據不會隨著應用程序重啟而丟失
分布式緩存和本地緩存不同,擁有自身獨立的內存空間,不會受到應用程序進程重啟的影響,在應用程序重啟時,分布式緩存的存儲數據仍然存在。
數據集中存儲,保證數據的一致性
當應用程序采用集群方式部署時,集群的每個部署節點都有一個統一的分布式緩存進行數據的讀寫操作,所以不會存在像本地緩存中數據更新問題,保證了不同服務器節點的 數據一致性。
數據讀寫分離,高性能,高可用
分布式緩存一般支持數據副本機制,實現讀寫分離,可以解決高并發場景中的數據讀寫性能問題。而且在多個緩存節點冗余存儲數據,提高了緩存數據的可用性,避免某個緩存節點宕機導致數據不可用問題。
分布式緩存缺點:
數據跨網絡傳輸,讀寫性能不如本地緩存
分布式緩存是一個獨立的服務進程,并且和應用程序進程不在同一臺機器上,所以數據的讀寫要通過遠程網絡請求,這樣相對于本地緩存的數據讀寫,性能要低一些。
分布式緩存的實現:
分布式緩存的典型實現包括 MemCached 和 Redis。
3、多級緩存
基于本地緩存和分布式緩存的優缺點,多級緩存應運而生,在實際的業務開發中一般也是采用多級緩存。
注意:本地緩存一般存儲更新頻率低,訪問頻率高數據,分布式緩存一般存儲更新頻率很高的數據。
多級緩存的請求流程: 本地緩存作為一級緩存,分布式緩存作為二級緩存;當用戶獲取數據時,先從一級緩存中獲取數據,如果一級緩存有數據則返回數據,否則從二級緩存中獲取數據。如果二級緩存中有數據則更新一級緩存,然后將數據返回客戶端。如果二級緩存沒有數據則去數據庫查詢數據,然后更新二級緩存,接著再更新一級緩存,最后將數據返回給客戶端。
多級緩存的實現: 可以使用Guava或者Caffeine作為一級緩存,Redis作為二級緩存。
注意:在應用程序集群部署時,如果數據庫的數據有更新的情況,一級緩存的數據更新容易出現數據不一致的情況。因為是集群部署,多個部署節點實現一級緩存數據更新難度比較大,不過我們可以通過Redis的消息發布/訂閱機制來實現多個節點緩存數據一致性問題。
文章來源:騰訊,如涉及到版權問題,請聯系網站管理員刪除!
- 上一篇:沒有啦
- 下一篇:MySQL 設計數據表時,時間類型 datetime、big 2023/1/7
