使用Redis在Hibernate中進行快取
Hibernate是Java程式語言的開放原始碼,物件/關係對映框架。Hibernate的目標是幫助開發人員擺脫許多繁瑣的手動資料處理任務。Hibernate能夠在Java類和資料庫表之間以及Java和SQL中的資料型別之間建立對映。
任何處理大量資料的非平凡應用程式都必須依靠快取和其他技術來提高效率。快取是一種通過使用緩衝區儲存經常訪問的資料來提高應用程式效能的策略。通過減少資料庫請求的數量並將資料儲存在更靠近CPU的位置,快取可以顯著提高應用程式的速度。
在本文中,我們將研究如何使用Redisson(一種用於訪問記憶體中資料結構儲存Redis的Java包裝器)在Hibernate中執行快取。
Hibernate 第一級 二級快取
Hibernate使用多級快取方案。第一級是強制性的,預設情況下處於啟用狀態,而第二級是可選的。
一級快取
一級快取(也稱為L1快取)與Hibernate的Session物件相關聯,該物件表示Java應用程式和SQL資料庫之間的連線。這意味著僅在會話存在的前提下,一級快取才可用。每個第一級快取只能由與其關聯的Session物件訪問。
首次從資料庫中查詢實體時,該實體將儲存在與該會話關聯的第一級快取中。在同一會話期間對此實體的任何後續查詢都將從快取而不是資料庫中檢索實體。
二級快取
二級快取(也稱為L2快取)預設情況下處於禁用狀態,但可以通過修改Hibernate的配置設定來啟用。該快取與Hibernate的SessionFactory物件相關聯,主要用於儲存應在Session之間持久的資料。在查詢第二級快取之前,應用程式將始終在第一級快取中搜索給定實體的存在。
Hibernate還具有第三種類型的快取:查詢快取,用於儲存特定資料庫查詢的結果。當您需要使用相同的引數多次執行相同的查詢時,這很有用
Hibernate中的二級快取有幾種不同的實現,包括Ehcache和OSCache。在本文的其餘部分中,我們將探討Hibernate中用於二級快取的另一個選項:Redisson,它允許將Redis用作Hibernate快取
如何使用Hibernate和Redis進行快取
原始碼案例- RedissonCacheRegionFactory
選擇策略
Redisson是Java中的Redis客戶端,其中包含許多Java物件和服務的實現,包括Hibernate快取。Redisson支援所有四種Hibernate快取策略:
- READ_ONLY:僅用於在快取內部不會更改的實體。
- NONSTRICT_READ_WRITE:在事務修改資料庫中的實體之後,更新快取。無法保證強一致性,但可以保證最終一致性。
- READ_WRITE:通過使用“軟”鎖來保證強一致性,這些鎖將保持對實體的控制,直到事務完成為止。
- 事務性:通過使用分散式XA事務確保資料完整性。確保將更新提交或回滾到資料庫和快取。
Redisson提供了各種Hibernate CacheFactories,包括那些支援本地快取的。如果您打算將Hibernate快取主要用於讀取操作,或者您不想進行太多的網路往返,則本地快取是一個明智的解決方案。
該 RedissonRegionFactory 工具實現了基本的Hibernate快取,而 RedissonLocalCachedRegionFactory (在Redisson PRO版本中可用)實現了具有本地快取支援的Hibernate快取。
配置依賴
redisson-hibernate 可以使用Maven或Gradle 將 依賴項輕鬆整合到您的專案中。對於JDK 1.8,Maven設定為:
<dependency>
<groupId>org.redisson</groupId>
<!-- for Hibernate v4.x -->
<artifactId>redisson-hibernate-4</artifactId>
<!-- for Hibernate v5.0.x - v5.1.x -->
<artifactId>redisson-hibernate-5</artifactId>
<!-- for Hibernate v5.2.x -->
<artifactId>redisson-hibernate-52</artifactId>
<!-- for Hibernate v5.3.x - v5.4.x -->
<artifactId>redisson-hibernate-53</artifactId>
<version>3.10.2</version>
</dependency>
並且Gradle設定是:
// for Hibernate v4.x
compile 'org.redisson:redisson-hibernate-4:3.10.2'
// for Hibernate v5.0.x - v5.1.x
compile 'org.redisson:redisson-hibernate-5:3.10.2'
// for Hibernate v5.2.x
compile 'org.redisson:redisson-hibernate-52:3.10.2'
// for Hibernate v5.3.x - v5.4.x
compile 'org.redisson:redisson-hibernate-53:3.10.2'
要CacheFactory 在Redisson中定義 in,請在Hibernate配置中插入適當的屬性:
<!-- Redisson Region Cache factory -->
<property name="hibernate.cache.region.factory_class" value="org.redisson.hibernate.RedissonRegionFactory" />
<!-- or -->
<property name="hibernate.cache.region.factory_class" value="org.redisson.hibernate.RedissonLocalCachedRegionFactory" />
啟用配置
您還需要啟用Hibernate的二級快取並指定Redisson配置檔案:
<!-- 2nd level cache activation -->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<!-- Redisson YAML config (located in filesystem or classpath) -->
<property name="hibernate.cache.redisson.config" value="/redisson.yaml" />
<!-- Redisson JSON config (located in filesystem or classpath) -->
<property name="hibernate.cache.redisson.config" value="/redisson.json" />
配置快取引數
Redisson允許您為Hibernate快取更改許多不同的重要引數,包括:
- Redis中快取的最大大小
- Redis中每個快取條目的生存時間
- Redis中每個快取條目的最大空閒時間
- 本地快取的最大大小
- 每個本地快取條目的生存時間
每個本地快取條目的最大空閒時間
一旦達到快取記憶體的最大大小(LFU,LRU,SOFT,WEAK或NONE),就對本地快取記憶體逐出策略
跨所有例項將更改同步到本地快取的策略(INVALIDATE,UPDATE或NONE)
連線失敗(CLEAR,LOAD或NONE)後重新載入丟失的更新的重新連線策略
Hibernate 二級快取 - RedissonCacheRegionFactory
mPaaS(Microservice PaaS) 微服務開發平臺 基於SpringBoot2.x、SpringCloud並採用前後端分離的多租戶系統架構微服務開發平臺
喜歡閱讀Spring、SpringBoot、SpringCloud等底層原始碼的可以關注下mPass 微服務開發平臺,期待您的寶貴意見!