使用快取

快取可以在JHipster中用於兩個級別:

  • 使用Spring Cache抽象,這是生成應用程式時的一個特定問題,並且使用Spring Boot @EnableCaching註解。這需要根據您的特定業務需求進行調整,並且比Hibernate 2級快取更高階。
  • 作為Hibernate 2級快取,快取解決方案可以極大地提高應用程式的效能,這就是人們通常使用JHipster所做的。請注意,如果您選擇使用Spring Cache,則此選項僅適用於SQL資料庫。

Spring Cache和Hibernate 2級快取將使用相同的快取解決方案,但不能在同一級別上使用:我們不建議對同一物件同時使用這兩個快取,因為這會使快取失效問題更加複雜。相反,我們建議您使用:

  • Spring Cache用於更高階別或聚合的物件,就像您通常使用的DTO一樣
  • 用於對映到資料庫的實體的Hibernate 2級快取,以減少SQL請求的數量

JHipster支援以下快取實現:

  1. Ehcache,
  2. Caffeine,
  3. Hazelcast,
  4. Infinispan,
  5. Memcached,
  6. Redis。

它們都在下面詳細說明。

通用設定

快取是在CacheConfiguration類別中設定的,也可以使用JHipster通用應用程式屬性進行調整。

使用Ehcache快取

Ehcache是​​JHipster生成monoliths應用的預設快取。Ehcache啟動速度非常快,因此它是”常規”單體應用的完美解決方案。

使用JHipster,Ehcache無法作為分散式快取使用,因為它沒有允許以程式設計方式新增新節點的API

Ehcache是​​在CacheConfiguration Spring設定bean中設定的,該設定bean在JHipster通用應用程式屬性中定義了2個屬性(time-to-live-secondsmax-entries)。可以在應用程式的特定ApplicationProperties Spring設定bean中新增更多屬性。

預設情況下,在devprod模式下,time-to-live-seconds的預設值均為3600秒(1小時),在dev模式下max-entries的預設值為100項,在生產模式下的預設值為1000項。

這些值應根據您的特定業務需求進行調整,並且JHipster監視螢幕可以幫助您更好地瞭解應用程式中的快取使用情況。另請參閱Ehcache文件以微調這些值。

使用Caffeine快取

Caffeine是一種高效能接近最佳的快取函式庫,是EHcache的替代品,可用於JHipster中的monoliths應用。

與Ehcache類似,Caffeine無法用作分散式快取。

Jhipster會為Caffeine生成與Ehcache相同的預設設定。但是,您可能希望新增其他選項以根據需要進行微調。Caffeine快取設定是在CacheConfiguration Spring設定bean中完成的,而您的應用程式特定的屬性可以新增到ApplicationProperties bean中。您可能會發現以下三個檔案對於定義自己的Caffeine設定很有用。

使用Hazelcast快取

Hazelcast可以用作本地快取(如Ehcache),但也可以用作分散式快取。結果是:

  • 這是微服務的預設選項,因為我們希望微服務能夠擴充套件
  • 這是閘道器的預設選項,因為我們希望它們能夠擴充套件,並且因為Hazelcast可以用於分佈閘道器速率限制訊息
  • 當在monolith中使用時,Hazelcast需要具有JHipster Registry選項才能擴充套件

對於擴充套件應用程式,Hazelcast將使用設定的服務發現來查詢新節點並水平擴充套件。對於微服務和閘道器,這將與JHipster Registry和Consul一起使用,而對於monolith,則僅與JHipster Registry一起使用。

新增新節點後,它將在服務發現中註冊自己(例如,它將在JHipster Registry中可用),並尋找相同型別的其他節點。如果找到一個或多個相同型別的節點,它將使用它們建立一個叢集快取:您應該在每個節點的日誌中看到一條訊息,如以下範例所示:

[172.18.0.10]:5701 [dev] [3.7]
Members [4] {
Member [172.18.0.10]:5701 - 3cbddfcd-0229-4cd5-be55-4611927a9071 this
Member [172.18.0.5]:5701 - 204d457d-f6fe-43f2-8e8d-497e96b3f08e
Member [172.18.0.14]:5701 - 7804d535-86fb-46be-b2a5-d7801dc6a4df
Member [172.18.0.11]:5701 - 6114ae28-56cd-4840-a575-4d73a6003744
}

為了更好地使用Hazelcast,JHipster包括對Hazelcast管理中心的支援:

  • 請注意,您只能免費監控2個節點,因為這是商業產品。但這已經足以測試您的應用程式。
  • application-dev.ymlapplication-prod.yml檔案中,參考JHipster常用應用程式屬性,透過鍵jhipster.cache.hazelcast.management-center對其進行設定。請注意,預設情況下它是關閉的。
  • JHipster生成了Docker Compose設定以執行Hazelcast管理中心。請閱讀我們的Docker Compose文件,然後使用docker-compose -f src/main/docker/hazelcast-management-center.yml up -d執行該應用程式。

使用Infinispan快取

Infinispan是一種高效能的快取解決方案,可以用作記憶體中的本地快取以及群集快取。它支援多種快取模式,

透過JHipster,Infinispan可以被用於:

  • 作為Spring Cache抽象的實現
  • 作為Hibernate 2級快取

以下是預設定的預設設定:

  • 實體以invalidation快取模式執行
  • 對於特定於應用程式的快取,預定義了三種快取設定
    • local-app-data 用於快取節點本地的資料
    • dist-app-data 用於跨節點的分散式資料快取(由分散式副本數確定的副本數)
    • repl-app-data 用於跨節點複製資料

可以使用JHipster通用應用程式屬性,微調快取中每個獨立操作模式的物件逐出,生存時間和最大條目數,以及分散式模式的副本數。微調jhipster.cache.infinispan中的屬性以用於特定於應用程式的快取,並微調spring.jpa.properties以用於Hibernate的第二級快取。

如果啟用了JHipster Registry,將在Registry中註冊節點清單。如果未啟用JHipster Registry,則節點發現將基於Infinispan Jar中打包的config-file中定義的預設傳輸設定。Infinispan原生發現支援大多數平台(例如Kubernets/OpenShift,AWS,Azure和Google)。

儘管Infinispan 9.0.0.Final GA和更高版本,透過使用本機KUBE_PING發現,增加了對在Kubernetes和OpenShift上執行Infinispan嵌入式快取應用程式的支援,但Hibernate依賴項尚未更新至9.x版本,因此不支援在Kubernetes和OpenShift本機發現。但是,您可以透過使用JHipster Registry進行實例發現來執行應用程式。

使用Memcached快取

Memcached是一個開源分散式快取。它與JHipster支援的其他快取實現完全不同:

  • Memcached不能用作Hibernate 2級快取,它僅支援Spring Cache抽象。
  • Memcached在遠端服務下執行,沒有本地快取​​。這樣,您的物件始終會通過網路進行序列化/反序列化,這意味著如果您的物件集很小,放入記憶體中,效率反而可能會降低。
  • 它非常易於擴充套件,並且運營成本低。大多數大型雲提供商(如Heroku,GCP或AWS)都支援Memcached。這樣,擁有分散式(且便宜)的Memcached叢集比使用其他快取實現要容易得多。

JHipster將流行的Xmemcached Java用戶端用於Memcached,並使用通常的JHipster通用應用程式屬性來設定其最重要的屬性。

請注意,每個快取記憶體必須在CacheConfiguration設定Bean中設定為特定的Spring Bean。

由於Memcached需要在其類載入器中對物件進行序列化/反序列化,因此在使用Spring Boot devtools(使用特定的類載入器對應用程式類進行熱重裝)時,該功能不起作用。這就是在開發人員模式下預設停用Memcached的原因。

JHipster依然如往日一樣提供了Docker Compose設定,因此您可以輕鬆地在電腦上啟動Memcached伺服器。為了使用它,請執行docker-compose -f src/main/docker/memcached.yml up -d

使用Redis快取

Redis是一個開源的記憶體資料結構儲存,可以用作高效能快取解決方案。當前,它在產生器JHipster中作為單個伺服器節點實現,但也可以作為分散式快取使用。

JHipster使用Redisson作為Redis Java用戶端主要有兩個原因:

  • Redis強烈推薦
  • 它提供了一個的JCache(JSR-107)的實現

由於我們在可用時使用JCache實現,因此這兩者都可以與其他快取保持一致,並在Spring快取和Hibernate 2級快取之間共享相同的Redis連線。