概述
Ehcache是一个开源的进程内缓存框架,可以提高系统性能,减轻数据库负载并简化可伸缩性。广泛用于基于Java的缓存开发,拥有健壮,可靠,功能齐全和便于与其他流行的库和框架集成等优点。详见Ehcache官网
Ehcache2和Ehcache3之间的差异比较大,本文主要介绍SpringBoot2.3整合Ehcache3.8,Ehcache有编码方式和xml配置方式引入项目,本文使用xml配置方式
引入相关依赖
Ehcache核心的依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
XML配置文件
<!--缓存模板-->
<cache-template name="defaultCache">
<key-type>java.lang.String</key-type>
<value-type>java.lang.String</value-type><!--默认Object-->
<resources>
<!--堆内20个条目(最多2000)-->
<heap unit="entries">20</heap>
<!--驱逐之前堆外内存10MB(最大500MB)-->
<offheap unit="MB">10</offheap>
</resources>
</cache-template>
<cache alias="userCache" uses-template="defaultCache">
<!--过期时间10分钟-->
<expiry>
<ttl unit="minutes">10</ttl>
</expiry>
</cache>
根据业务需要可以添加多个缓存,文件中的userCache是缓存名,下面的代码中会使用到
配置文件
该类主要是加载配置的缓存文件,创建CacheManager实例
@Configuration
public class EhcacheConfig {
@Bean(name = "ehcacheManager")
public CacheManager getEhcacheManager() {
URL url = getClass().getResource("/ehcacheConfig.xml");
org.ehcache.config.Configuration configuration = new XmlConfiguration(url);
CacheManager cacheManager = CacheManagerBuilder.newCacheManager(configuration);
cacheManager.init();
return cacheManager;
}
}
业务层核心代码
@Resource(name = "ehcacheManager")
private CacheManager cacheManager;
@Override
public void putCache(String cacheName, String key, String value) {
Cache<String, String> cache = cacheManager.getCache(cacheName, String.class, String.class);
cache.put(key, value);
}
@Override
public String getCache(String cacheName, String key) {
Cache<String, String> cache = cacheManager.getCache(cacheName, String.class, String.class);
String cacheValue = cache.get(key);
return cacheValue;
}
控制层核心代码
@GetMapping("getUserByLoginName/{loginName}")
@ApiOperation(value = "根据登录名查询用户信息")
public AjaxResult getUserByLoginName(@PathVariable String loginName) {
String cacheValue = cacheService.getCache("userCache", loginName);
if (null != cacheValue && !"".equals(cacheValue)) {
logger.info("缓存中有查询的数据", cacheValue);
return AjaxResult.ok().data("loginName", cacheValue);
} else {
QueryWrapper<SysUser> wrapper = new QueryWrapper<SysUser>();
wrapper.eq("login_name", loginName);
SysUser user = userService.getOne(wrapper);
logger.info("缓存中没有数据,从数据库查询", user.toString());
cacheService.putCache("userCache", loginName, user.getLoginName());
return AjaxResult.ok().data("loginName", user.getLoginName());
}
}
完整代码参考码云地址