springboot + ehcache

262 阅读1分钟

1. 添加maven依赖

<dependency>  
<groupId>org.springframework.boot</groupId>  
<artifactId>spring-boot-starter-cache</artifactId>  
<version>2.4.2</version>  
</dependency>
<dependency>  
<groupId>org.ehcache</groupId>  
<artifactId>ehcache</artifactId>  
<version>3.9.9</version>  
</dependency>

2. xml文件配置

<config  
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'  
xmlns='http://www.ehcache.org/v3'  
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd">  
<!-- 磁盘存储路径 -->  
<persistence directory="./ehcacheData"/>  
<!-- 管理 -->  
<cache alias="jushuitan">  
<key-type>java.lang.String</key-type>  
<value-type>java.lang.String</value-type>  
<!-- 过期时间,去掉此标签则不过期 -->  
<expiry>  
<!-- 缓存存活时间 -->  
<ttl unit="days">29</ttl>  
<!-- 缓存的空闲时间,无法和ttl并存 -->  
<!-- <tti unit="seconds">2</tti> -->  
</expiry>  
<resources>  
<!-- 堆外内存,限制1024MB -->  
<offheap unit="MB">1024</offheap>  
</resources>  
</cache>  
  
<!-- 用于otherCache的管理 -->  
<cache alias="otherCache">  
<key-type>java.lang.String</key-type>  
<value-type>com.stc.login.model.userTokenCacheInfo</value-type>  
<expiry>  
<ttl unit="seconds">30</ttl>  
</expiry>  
<resources>  
<!-- 堆内存的大小限制为2个条目 -->  
<heap unit="entries">2</heap>  
<!-- 堆外内存的大小限制为10MB -->  
<offheap unit="MB">10</offheap>  
<!-- 磁盘缓存 persistent属性用于指定磁盘缓存是否持久化 -->  
<disk unit="MB" persistent="false">20</disk>  
</resources>  
</cache>  
</config>
/**  
* xml配置方式  
*  
* @return /  
*/  
@Bean(name = "ehcacheManager")  
public CacheManager s() {  
URL url = getClass().getResource("/ehcache.xml");  
assert url != null;  
XmlConfiguration xmlConfiguration = new XmlConfiguration(url);  
CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfiguration);  
cacheManager.init();  
return cacheManager;  
} 

3.编程配置

@Configuration  
public class EhcacheConfig {  
  
/**  
* 编程方式  
*  
* @return /  
*/  
@Bean(name = "ehcacheManager")  
public CacheManager cacheManager() {  
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()  
.withCache("cacheName1",  
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder()  
.heap(10, EntryUnit.ENTRIES)  
.offheap(1, MemoryUnit.MB)  
.disk(20, MemoryUnit.MB, true))).build();  
cacheManager.init();  
return cacheManager;  
}  
  
}

4. 工具使用

@Component
public class EhcacheUtil implements InitializingBean{

	@Resource(name = "ehcacheManager")
	private CacheManager cacheManager;
	private Cache<String, String> cache;



	public void put(String k, String v) {
		cache.put(k, v);
	}



	public String get(String k) {
		return cache.get(k);
	}



	public void remove(String k) {
		cache.remove(k);
	}



	public Boolean containsKey(String k) {
		return cache.containsKey(k);
	}



	@Override

	public void afterPropertiesSet() throws Exception {
		this.cache = cacheManager.getCache("payment", String.class, String.class);
	}

}

5. 缓存模型

  • heap :堆上存储-利用Java的堆上RAM内存来存储缓存条目。
  • off-heap: 堆外内存-大小仅受可用RAM限制,不受Java垃圾回收(GC)的约束。
  • disk:利用磁盘(文件系统)存储缓存条目。
  • clustered:群集存储-该数据存储是远程服务器上的缓存。

可能出现的组合

  • heap + offheap
  • heap + offheap + disk
  • heap + offheap + clustered
  • heap + disk
  • heap + clustered

6. spring自动配置使用

  • application.yml文件
spring: 
    cache:
        type: jcache
    jcache: 
        config: classpath:ehcache.xml
        # ehcache3用jcache
<dependency>  
<groupId>javax.cache</groupId>  
<artifactId>cache-api</artifactId>  
<version>1.0.0</version>  
</dependency>
  • 自动使用

在完成 Ehcache 的配置后,就可以在 Spring Boot 中使用 Ehcache 缓存了。Spring Boot 提供了 @Cacheable@CachePut@CacheEvict 等注解来简化缓存操作;

  • 手动使用@Autowired private CacheManager cacheManager;

git地址github.com/ehcache/ehc…