使用Redis在Hibernate中進行快取
- 2019 年 10 月 29 日
- 筆記
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 微服務開發平台,期待您的寶貴意見!