一、springboot ehcahe3實現步驟
EhCache 是一個純Java的進程內緩存框架,具有快速、精干等特點,是Hibernate中默認CacheProvider。
Ehcache是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,Java EE和輕量級容器。它具有內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點。
1.1、主要特性:
快速、簡單、多種緩存策略
緩存數據有兩級:內存和磁盤,因此無需擔心容量問題
緩存數據會在虛擬機重啟的過程中寫入磁盤
可以通過RMI、可插入API等方式進行分布式緩存
具有緩存和緩存管理器的偵聽接口
支持多緩存管理器實例,以及一個實例的多個緩存區域
提供Hibernate的緩存實現
注意:ehcache 對分布式支持不夠好,多個節點不能同步,通常和redis一塊使用
1.2、和Redis比較:
ehcache直接在jvm虛擬機中緩存,速度快,效率高;但是緩存共享麻煩,集群分布式應用不方便。
redis是通過socket訪問到緩存服務,效率比ecache低,比數據庫要快很多,處理集群和分布式緩存方便,有成熟的方案。
如果是單個應用或者對緩存訪問要求很高的應用,用ehcache。如果是大型系統,存在緩存共享、分布式部署、緩存內容很大的,建議用redis。
ehcache也有緩存共享方案,不過是通過RMI或者Jgroup多播方式進行廣播緩存通知更新,緩存共享復雜,維護不方便;簡單的共享可以,但是涉及到緩存恢復,大數據緩存,則不合適。
ehcache3.x與2.x的差距還是非常大的,主要區別在於3.x后使用了java的緩存規范JSR107
1.3、基礎配置
參看:002-spring cache 基於聲明式注解的緩存-01-Cacheable annotation
參看上述兩個配置
代碼地址:https://github.com/bjlhx15/common.git spring-cache/springboot2-cache-ehcache2
代碼地址:https://github.com/bjlhx15/common.git spring-cache/springboot2-cache-ehcache3
二、springboot caffeine實現步驟
Caffeine是使用Java8對Guava緩存的重寫版本,在Spring Boot 2.0中將取代Guava。如果出現Caffeine,CaffeineCacheManager將會自動配置。使用spring.cache.cache-names屬性可以在啟動時創建緩存,並可以通過以下配置進行自定義(按順序):
- spring.cache.caffeine.spec: 定義的特殊緩存
- com.github.benmanes.caffeine.cache.CaffeineSpec: bean定義
- com.github.benmanes.caffeine.cache.Caffeine: bean定義
代碼地址:https://github.com/bjlhx15/common/tree/master/spring-cache/spring-cache-caffeine
1、pom
2、啟動類注解
3、業務類注解
4、配置
spring:
cache:
cache-names: user
caffeine:
spec: initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s
其中spec配置參數
initialCapacity=[integer]: 初始的緩存空間大小
maximumSize=[long]: 緩存的最大條數
maximumWeight=[long]: 緩存的最大權重
expireAfterAccess=[duration]: 最后一次寫入或訪問后經過固定時間過期
expireAfterWrite=[duration]: 最后一次寫入后經過固定時間過期
refreshAfterWrite=[duration]: 創建緩存或者最近一次更新緩存后經過固定的時間間隔,刷新緩存
weakKeys: 打開key的弱引用
weakValues:打開value的弱引用
softValues:打開value的軟引用
recordStats:開發統計功能
注意:如果使用了refreshAfterWrite配置還必須指定一個CacheLoader,如:
package com.lhx.spring.cache.caffeine; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.github.benmanes.caffeine.cache.CacheLoader; @Configuration public class CacheLoaderSelf { /** * 必須要指定這個Bean,refreshAfterWrite=5s這個配置屬性才生效 * */ @Bean public CacheLoader<Object, Object> cacheLoader() { CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() { @Override public Object load(Object key) throws Exception { return null; } // 重寫這個方法將oldValue值返回回去,進而刷新緩存 @Override public Object reload(Object key, Object oldValue) throws Exception { return oldValue; } }; return cacheLoader; } }
注意:
- expireAfterWrite和expireAfterAccess同事存在時,以expireAfterWrite為准。
- maximumSize和maximumWeight不可以同時使用
- weakValues和softValues不可以同時使用