ehcache在Spring Boot中的应用
ehcache的应用
缓存在我们的日常工作中,是必不可少的!原因是:大量的数据全部从数据库中查询,会给数据库造成压力,为了减少数据库压力,我们通常采用的办法是,提前将数据放在缓存中,需要时直接从缓存中获取即可!从而减少了数据库的访问,降低了数据库压力!
ehcache相关配置说明
缓存目录,默认为计算机系统的临时空间,也可自己设置!
<diskStore path="java.io.tmpdir"/>
相关熟悉的说明:
(1)maxElementsInMemory:缓存内容是存在内存中的,此项是设置内存中最多可以存储多少个元素(java对象)
(2)eternal:缓存数据是否永久有效
(3)timeToIdleSeconds:最大空闲时间,单位是秒,缓存数据不使用时间超过设置时间,即作废((2)设置为false的情况下使用)
(4)timeToLiveSeconds:生命周期,单位是秒,不管使不使用,达到设置时间,即作废((2)设置为false的情况下使用)
(5)overflowToDisk:溢出到磁盘,设置为true后,缓存数量超过(1)所设置的最大数量后,超出的部分缓存到上面所设置的临时空间
(6)maxElementsOnDisk:设置磁盘中最多可以存储多少个元素(java对象)
(7)diskPersistent:磁盘内容的持久化,意思是当服务器(例如tomcat)重启后,磁盘上缓存的内容还要不要,true是要,false是不要
(8)diskExpiryThreadIntervalSeconds:启动线程时间,单位是秒,每隔多长时间启动一个线程,清理掉无用数据
(9)memoryStoreEvictionPolicy:淘汰策略,就是判定数据是否有用的标准:(1)LRU:最近最少使用(2)FIFO:先进先出,主要使用这两种策略
准备一个用不过期的配置:
<cache name="CONSTANT"
maxElementsInMemory="1"
eternal="true"
clearOnFlush="false"
overflowToDisk="true"
diskSpoolBufferSizeMB="1024"
maxElementsOnDisk="100000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
</cache>
ehcache在Spring中的配置
获取ehcache.xml中的cache的配置,交给CacheManager进行管理:
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager(EhCacheManagerFactoryBean bean) {
return bean.getObject();
}
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache/ehcache.xml"));
cacheManagerFactoryBean.setShared(true);
// 设置完属性后,cacheManagerFactoryBean会执行afterProertiesSet()方法,
// 所以不能在这里直接执行cacheManagerFactoryBean.getObject(),直接执行的话,
// 因为在afterPropertiesSet()方法之前执行,所以:getObject()会得到null值
return cacheManagerFactoryBean;
}
}
通过CacheManager操作具体的Cache:
@Autowired
private CacheManager cacheManager;
/**
* 获取缓存信息
* @param cacheName 缓存名
* @param key 自定义key
* @param <T> 返回值
* @return
*/
public <T> T getCache(String cacheName,String key) {
Cache cache = cacheManager.getCache(cacheName);
if (cache == null) {
return null;
}
Element element = cache.get(key);
if (element == null) {
return null;
}
return (T)element.getObjectValue();
}
/**
* 添加缓存信息
* @param cacheName
* @param key
* @param value
*/
public void putCache(String cacheName,String key, Object value) {
Cache cache = cacheManager.getCache(cacheName);
if (cache != null) {
Element element = new Element(key, value);
cache.put(element);
}
}
/**
* 清理缓存
* @param cacheName
* @param key
*/
public void evictCache(String cacheName,String key) {
Cache cache = cacheManager.getCache(cacheName);
if (cache != null) {
cache.remove(key);
}
}
ehcache实际演示
进行缓存数据操作:
@Autowired
private CacheManagerUtil cacheManagerUtil;
@PostConstruct
public void init(){
logger.info("AUTHIC表数据进行缓存开始.......");
List<Authic> allNamePass = authicMapper.getAllNamePass();
logger.info("本次缓存的数据量是:" + allNamePass.size() +"/条!");
for (Authic authic: allNamePass) {
logger.info("缓存的具体数据是:" + authic);
cacheManagerUtil.putCache(cacheNameConcats.cacheName,authic.getName(),authic.getPassword());
}
logger.info("AUTHIC表数据进行缓存结束.......");
}
查看控制台
通过控制台我们可以知道,当前的数据已经缓存了,通过缓存取数据,验证一下我们的猜想!
数据库中的数据:
通过请求获取key:小明的value:?
接口访问的返回值:
以上就是Ehcache的简单应用!