SpringBoot配置JVM缓存
编程语言
2019-05-09 17:49:48
阅读次数: 0
- 缓存分类:缓存分为内存缓存和JVM缓存
内存缓存 如:redis
JVM缓存 只在java中使用,单个JVM有效
- 缓存 的使用场景
减轻数据库访问压力
- 创建springboot工程<本文配置的是JVM缓存>
- 在pom.xml中添加缓存依赖
<!-- springboot缓存依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
- resources目录下建立ehcache.xml配置文件, 内容:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="java.io.tmpdir/Tmp_EhCache" />
<!-- name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除
-->
<!-- 默认配置 -->
<defaultCache maxElementsInMemory="5000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120"
memoryStoreEvictionPolicy="LRU" overflowToDisk="false" />
<cache name="baseCache" maxElementsInMemory="10000"
maxElementsOnDisk="100000" />
</ehcache>
- 在App启动类中加上开启缓存注解@EnableCaching // 开启缓存注解
package com.trip;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching // 开启缓存注解
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(App.class, args);
}
}
- 创建user相关类和业务逻辑层
// 控制层
@Controller
public class IndexController {
@Autowired
private UserService userService;
@GetMapping("/obtain")
@ResponseBody
public Object obtain(){
return userService.getUserMapper().findByPhone("17688796355");
}
}
// 业务逻辑层
package com.trip.ehCache.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.trip.ehCache.dao.UserMapper;
@Service
@Transactional
public class UserService {
@Autowired
private UserMapper userMapper;
public UserMapper getUserMapper() {
return userMapper;
}
}
// 数据访问层
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import com.trip.ehCache.entity.User;
@CacheConfig(cacheNames = "baseCache") // 配置ehcache.xml注解, baseCache为配置文件定义的名称
public interface UserMapper extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>{
@Cacheable // 该查询使用缓存注解
User findByPhone(String phone);
}
- 测试url http://localhost:8080/obtain
- 删除数据库的数据,页面依然显示
- 删除缓存
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.trip.ehCache.service.UserService;
@Controller
public class IndexController {
@Autowired
private UserService userService;
@Autowired
private CacheManager cacheManager;
/**
* 添加缓存
* @return
*/
@GetMapping("/obtain")
@ResponseBody
public Object obtain(){
return userService.getUserMapper().findByPhone("17688796355");
}
/**
* 删除缓存
* @return
*/
@GetMapping("/delete")
@ResponseBody
public Object delete(){
cacheManager.getCache("baseCache").clear();
return "删除缓存";
}
}
-
转载自blog.csdn.net/xiaobo5264063/article/details/89647428