一.JVM內置緩存(值存放在JVM緩存中)
我們可以先了解一下Cookie,Session,和Cache
Cookie:當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie里的內容來判斷使用者,送出特定的網頁內容給你。具體來說Cookie機制采用的是在客戶端保持狀態的方案(保存客戶瀏覽器請求服務器頁面的請求信息),而Session機制采用的是在服務器端保持狀態的方案。
Cookie存儲的數據量受限制,不僅有大小限制,還有個數限制,因此不適合存放大數據。由於並非所有的瀏覽器都支持Cookie,數據將以明文的形式保存在客戶端。
Session:session一般用來保存每一個用戶的專有信息,Session緩存信息保存在web服務器當中,並且Session緩存容易丟失,導致數據的不確定性。而且Session不適宜放大量信息,否則會導致服務器性能降低。
Cache:Cache用於在Http請求期間保存頁面或者數據,而且它的使用可以大大的提高整個應用程序的效率。它允許將頻繁訪問的服務器資源存儲在內存中,當用戶發出相同的請求后,服務器不是再次處理而是將Cache中保存的數據直接返回給用戶,可以看出Cache節省的是時間—服務器處理時間。Cache實例是每一個應用程序專有的,其生命周期==該應用程序周期,應用程序重啟將重新創建其實例。
JVM的內置緩存:
oscache:oscache 主要是對頁面的緩存,可以整頁或者指定網頁某一部分緩存,同時指定它的過期時間,這樣在此時間段里面訪問的數據都是一樣的
ehcache:ehcache主要是對數據庫訪問的緩存,相同的查詢語句只需查詢一次數據庫,從而提高了查詢的速度,使用spring的AOP可以很容易實現這一功能
二.MyBatis和Hibernate緩存簡單介紹
MyBatis一級緩存:MyBatis 默認開啟了一級緩存,一級緩存是在SqlSession 層面進行緩存的。SqlSession對象被創建,一級緩存就存在了,如果Session對象關閉或調用清理方法,會導致緩存失效。緩存底層實現就是通過HashMap實現的。
MyBatis二級緩存:mybatis中的二級緩存是mapper級別的緩存,值得注意的是,不同的mapper通常情況下有不同的namespace,就都有一個二級緩存,也就是說,不同的mapper之間的二級緩存是互不影響的。(MyBatis二級緩存默認使用的是oscache)
Hibernate一級緩存:session提供了一級緩存的功能,默認總是有效的,應用保存持久化實體、修改持久化實體時,session不會立即將改變提交數據庫,而是緩存在當前session,除非顯示調用了session的flush()方法或通過close()方法關閉session。通過一級緩存,可以減少應用程序與數據庫的交互,提高數據庫訪問性能。
Hibernate二級緩存:Hibernate二級緩存是SessionFactory級的緩存。 SessionFactory的緩存分為內置緩存和外置緩存。內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據及預定SQL語句等),對於應用程序來說,它是只讀的。外置緩存中存放的是數據庫數據的副本,其作用和一級緩存類似.二級緩存除了以內存作為存儲介質外,還可以選用硬盤等外部存儲設備。二級緩存稱為進程級緩存或SessionFactory級緩存,它可以被所有session共享,它的生命周期伴隨着SessionFactory的生命周期存在和消亡。(Hibernate二級緩存默認使用的是ehcache)
三.Redis緩存
簡介:
redis是一個key-value存儲系統。速度快,也支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
Redis緩存一般是在service層開啟,如果緩存中有數據,請求就不用再進入dao層,也不用再次與數據庫連接,能減輕服務器壓力,提高性能。(查詢內存比查詢數據庫效率更高)
應用:
分布式鎖
session共享
token生成
驗證碼
......
詳細介紹可用參考我的另一篇隨筆https://www.cnblogs.com/ywb-articles/p/10660071.html
