SpringBoot---day10--整合缓存技术

一: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);
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值