一:SpringBoot整合Ehcache
1.修改pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<groupId>com.springboot</groupId>
<artifactId>23-springboot-ehcache</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 修改jdc版本 -->
<properties>
<java.version>1.7</java.version>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<!--SpringBoot启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf启动器的坐标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- jpa启动器的坐标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 添加junit环境的jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- Spring Boot缓存支持启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- Ehcache坐标 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
</dependencies>
</project>
2.创建ehcache的配置文件
文件名:ehcache.xml
位置:src/main/resouce/ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="java.io.tmpdir" />
<!-- 是ehcache默认的缓存策略 -->
<defaultCache maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap" />
</defaultCache>
<!-- 自定义缓存策略 -->
<cache name="users"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap" />
</cache>
</ehcache>
3.修改application.properties文件
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_jpa
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.cache.ehcache.config=ehcache.xml
4.修改启动类
@SpringBootApplication
@EnableCaching
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
5.创建业务层
/**
* UsersService接口实现
* @author Administrator
*
*/
@Service
public class UsersServiceImpl implements UsersService {
@Autowired
UsersRepository usersRepository;
@Override
public List<Users> findUserAll() {
return usersRepository.findAll();
}
@Override
@Cacheable(value="users") //对当前查询的对象做缓存处理
public Users findUserById(Integer id) {
return usersRepository.findOne(id);
}
@Override
public Page<Users> findUserByPage(Pageable pageable) {
return usersRepository.findAll(pageable);
}
@Override
public void SaveUsers(Users users) {
usersRepository.save(users);
}
}
6.修改实体类Users
@Entity
@Table(name="t_users")
public class Users implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@Column(name="age")
private Integer age;
@Column(name="address")
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Users [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
7.添加测试类
/**
* 这是UsersServiceTest
* @author Administrator
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=App.class)
public class UsersServiceTest {
@Autowired
private UsersService usersService;
@Test
public void testFindUserById() {
Users users = usersService.findUserById(1);
System.out.println(users);
Users users1 = usersService.findUserById(1);
System.out.println(users1);
}
}
二:@Cacheable与@CacheEvict
1.@Cacheable
@Cacheable作用:把方法的返回值添加到Ehcache中做缓存
valuew属性:指定一个Ehcache配置文件中的缓存策略,如果没有给定value,name则表示默认的缓存策略。
key属性:给存储的值起个名称。在查询时如果有名称相同的,那么直接从缓存中将数据返回
1.1.业务层代码
@Override
@Cacheable(value="users",key="#pageable.pageSize")
public Page<Users> findUserByPage(Pageable pageable) {
return usersRepository.findAll(pageable);
}
1.2.测试代码
@Test
public void testFindUserByPage() {
Pageable pageable = new PageRequest(0, 2);
Page<Users> list1 = usersService.findUserByPage(pageable);
System.out.println(list1.getTotalElements());
Page<Users> list2 = usersService.findUserByPage(pageable);
System.out.println(list2.getTotalElements());
pageable = new PageRequest(1, 2);
Page<Users> list3 = usersService.findUserByPage(pageable);
System.out.println(list3.getTotalElements());
}
2.@CacheEvict
@CacheEvict作用:清除缓存
2.1业务层的改动
/**
* UsersService接口实现
* @author Administrator
*
*/
@Service
public class UsersServiceImpl implements UsersService {
@Autowired
UsersRepository usersRepository;
@Override
@Cacheable(value="users")
public List<Users> findUserAll() {
return usersRepository.findAll();
}
@Override
@Cacheable(value="users") //对当前查询的对象做缓存处理
public Users findUserById(Integer id) {
return usersRepository.findOne(id);
}
@Override
@Cacheable(value="users",key="#pageable.pageSize")
public Page<Users> findUserByPage(Pageable pageable) {
return usersRepository.findAll(pageable);
}
@Override
@CacheEvict(value="users",allEntries=true) //清除缓存中以users缓存策略缓存的对象
public void SaveUsers(Users users) {
usersRepository.save(users);
}
}
2.2 测试代码
@Test
public void testFindAll() {
List<Users> list = usersService.findUserAll();
System.out.println(list.size());
Users users = new Users();
users.setAddress("南京");
users.setAge(43);
users.setName("韩浩");
usersService.SaveUsers(users);
List<Users> list1 = usersService.findUserAll();
System.out.println(list1.size());
}
三:SpringBoot整合Spring Data Redis
1.Linux下面安装redis---此部分网上有教程
Spring Data Redis是属于Spring Data 下的一个模块。作用就是简化对于redis的操作。
2.修改pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<groupId>com.springboot</groupId>
<artifactId>24-springboot-redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 修改jdc版本 -->
<properties>
<java.version>1.7</java.version>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<!--SpringBoot启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf启动器的坐标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Spring Data redis启动器的坐标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- test启动器的坐标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
3. 编写Spring Data Redis的配置类
/**
* 完成Redis的整合的一些配置
* @author Administrator
*
*/
@Configuration
public class RedisConfig {
/**
* 1.创建JedisPoolConfig对象。在该对象中完成一些链接池配置
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig config = new JedisPoolConfig();
//最大空闲数
config.setMaxIdle(10);
//最小空闲数
config.setMinIdle(5);
//最大链接数
config.setMaxTotal(20);
return config;
}
/**
* 2.创建JedisConnectionFactory:配置redis链接信息
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig config) {
JedisConnectionFactory factory = new JedisConnectionFactory();
//关联连接池的配置对象
factory.setPoolConfig(config);
//配置链接Redis的信息以及主机地址
factory.setHostName("192.168.25.128");
//端口--6379
factory.setPort(6379);
return factory;
}
/**
* 3.创建RedisTemplate:用于执行Redis操作的方法
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory factory){
RedisTemplate<String,Object> template = new RedisTemplate<String, Object>();
//关联
template.setConnectionFactory(factory);
//为key设置序列化器
template.setKeySerializer(new StringRedisSerializer());
//为value设置序列化器
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
4.编写测试类
/**
* Spring Data Redis 测试
* @author Administrator
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=App.class)
public class RedisTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 添加一个字符串
*/
@Test
public void testSet() {
redisTemplate.opsForValue().set("key", "好男人");
}
/**
* 获取一个字符串
*/
@Test
public void testGet() {
String object = (String) redisTemplate.opsForValue().get("key");
System.out.println(object);
}
}
4.提取Redis中的配置信息
4.1在src/main/resource/目录下新建一个配置文件:application.properties
spring.redis.pool.max-idle=10
spring.redis.pool.min-idle=5
spring.redis.pool.max-total=20
spring.redis.hostName=192.168.25.128
spring.redis.port=6379
4.2修改配置类
/**
* 完成Redis的整合的一些配置
* @author Administrator
*
*/
@Configuration
public class RedisConfig {
/**
* 1.创建JedisPoolConfig对象。在该对象中完成一些链接池配置
* @ConfigurationProperties:会将前缀相同的的内容创建一个实体。
*/
@Bean
@ConfigurationProperties(prefix="spring.redis.pool")
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig config = new JedisPoolConfig();
/*//最大空闲数
config.setMaxIdle(10);
//最小空闲数
config.setMinIdle(5);
//最大链接数
config.setMaxTotal(20);*/
return config;
}
/**
* 2.创建JedisConnectionFactory:配置redis链接信息
*/
@Bean
@ConfigurationProperties(prefix="spring.redis")
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig config) {
JedisConnectionFactory factory = new JedisConnectionFactory();
//关联连接池的配置对象
factory.setPoolConfig(config);
/*//配置链接Redis的信息以及主机地址
factory.setHostName("192.168.25.128");
//端口--6379
factory.setPort(6379);*/
return factory;
}
/**
* 3.创建RedisTemplate:用于执行Redis操作的方法
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory factory){
RedisTemplate<String,Object> template = new RedisTemplate<String, Object>();
//关联
template.setConnectionFactory(factory);
//为key设置序列化器
template.setKeySerializer(new StringRedisSerializer());
//为value设置序列化器
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
4.Spring Data Redis操作实体对象
4.1创建实体类
public class Users implements Serializable{
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Users [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
4.2测试代码
/**
* 添加Users对象
*/
@Test
public void testSetUsers() {
Users users = new Users();
users.setAge(20);
users.setName("乌鸡");
users.setId(1);
//重新设置序列化器
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.opsForValue().set("users", users);
}
/**
* 取User对象
*/
@Test
public void testGetUsers() {
//重新设置序列化器
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
Users users = (Users) redisTemplate.opsForValue().get("users");
System.out.println(users);
}
5.Spring Data Redis以JSON格式存储实体对象
测试代码
/**
* 基于JSON格式存放Users对象
*/
@Test
public void testSetUsersUseJSON() {
Users users = new Users();
users.setAge(20);
users.setName("花姑凉");
users.setId(2);
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Users.class));
redisTemplate.opsForValue().set("users_json", users);
}
/**
* 基于JSON格式获取Users对象
*/
@Test
public void testGetUseJSON() {
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Users.class));
Users users = (Users) redisTemplate.opsForValue().get("users_json");
System.out.println(users);
}