介绍
有两种使用Ehcache缓存的方法:
一种是通过@Cacheable注解自动缓存查询的数据,另一种是手动维护缓存数据。
准备工作
- maven依赖
<properties>
<ehcache.version>3.3.1</ehcache.version>
<ehcache.core.version>2.6.11</ehcache.core.version>
</properties>
<dependencies>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>${ehcache.core.version}</version>
</dependency>
</dependencies>
-
使用 @EnableCaching 标注在 springboot 主启动类上
-
EhCacheConfig配置eHcache缓存
@Configuration
@EnableCaching
public class EhCacheConfig {
@Bean
public EhCacheCacheManager cacheManager(CacheManager cacheManager) {
return new EhCacheCacheManager(cacheManager);
}
@Bean
public EhCacheManagerFactoryBean ehcache() {
EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
return ehCacheManagerFactoryBean;
}
}
- 配置好ehcache.xml文件
自动缓存(@Cacheable注解)
以BaseService基础服务类为例:
@Cacheable设置缓存
@Cacheable(value = Cache.APPLICATION, key = "#root.targetClass.simpleName+':'+#id")
public T get(ID id) {
return dao.getOne(id);
}
@CachePut更新缓存
@CachePut(value = Cache.APPLICATION, key = "#root.targetClass.simpleName+':'+#record.id")
public T update(T record) {
return dao.save(record);
}
@CacheEvict删除缓存
@CacheEvict(value = Cache.APPLICATION, key = "#root.targetClass.simpleName+':'+#id")
public void delete(ID id) {
dao.deleteById(id);
}
手动维护缓存
- 系统启动的时候通过CacheListener将数据加载到缓存
- 在具体的功能中使用的时候注入对应的缓存类使用即可。
- 数据更新的时候重新刷新缓存
这里摘录一些关键代码:
CacheListner缓存监听器,启动的时候将数据从数据库加载到缓存中
@Component
public class CacheListener implements CommandLineRunner {
@Autowired
private DictCache dictCache;
public void loadCache() {
dictCache.cache();
}
@Override
public void run(String... strings) throws Exception {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
loadCache();
}
});
thread.start();
}
}
DictCache表示缓存的字典数据,DictCache是继承了Cache的缓存接口。
Cache是顶级缓存接口,定义了缓存基本的三个方法
/**
* 顶级缓存接口
*/
public interface Cache {
/**
* 将数据库中的数据加载到缓存中
*/
void cache();
/**
* 获取缓存数据
*
* @param key
* @return
*/
Object get(String key);
/**
* 设置缓存数据
*
* @param key
* @param val
*/
void set(String key, Object val);
}
DictCacheImpl是DictCache的实现类
其中定义了设置和获取缓存的方法
@Override
public Object get(String key) {
return cacheDao.hget(CacheDao.CONSTANT, CacheKey.DICT + key);
}
@Override
public void set(String key, Object val) {
cacheDao.hset(CacheDao.CONSTANT, CacheKey.DICT + key, val);
}
CacheDao是缓存接口,EhcacheDao实现了它。
@Component
public class EhcacheDao implements CacheDao {
@Resource
private CacheManager cacheManager;
@Override
public void hset(Serializable key, Serializable k, Object val) {
Cache cache = cacheManager.getCache(String.valueOf(key));
cache.put(k, val);
}
@Override
public <T> T hget(Serializable key, Serializable k, Class<T> klass) {
Cache cache = cacheManager.getCache(String.valueOf(key));
return cache.get(k, klass);
}
}
注意不要直接使用EhcacheDao类,而是应该使用其接口CacheDao,以方便实际应用中往其他缓存服务切换(比如redis,ssdb等),就像上面的DictCacheImpl类一样。
代码来源于web-flash开源项目。