1. 在 Spring Boot 中集成 Redis (1)完成配置基础项。 添加 Redis、MySQL、MyBatis 依赖。
(2)配置MySQL、Redis服务器 可以直接在application.yml文件中逬行配置,具体配置方法见以下代码:
spring: redis: host: 127.0 .0 .1 port: 6379 jedis: pool: max-active: 8 max-wait: -1 max-idle: 8 min-idle: 0 timeout: 5000 datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true username: root password: 123456 thymeleaf: mode: HTML encoding: UTF-8 servlet: content-type: text/html cache: false prefix: classpath:/static/ mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl server: port: 8080
(3)在入口类加上@EnableCaching注解,开启缓存支持。 2. 配置Redis类 要想启用Spring缓存支持,需创建一个CacheManager的Bean
package com.intehel.demo.config;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import java.lang.reflect.Method;@Configuration public class RedisConfig extends CachingConfigurerSupport { @Override @Bean public KeyGenerator keyGenerator () { return new KeyGenerator () { @Override public Object generate (Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder (); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } @SuppressWarnings("rawtypes") @Bean public CacheManager cacheManager (RedisConnectionFactory connectionFactory) { RedisCacheManager cacheManager = RedisCacheManager.create(connectionFactory); return cacheManager; } @Bean public RedisTemplate<String,Object> redisTemplate (RedisConnectionFactory factory) { RedisTemplate<String,Object> redisTemplate = new RedisTemplate <String,Object>(); redisTemplate.setConnectionFactory(factory); return redisTemplate; } @Bean public StringRedisTemplate stringRedisTemplate (RedisConnectionFactory factory) { StringRedisTemplate stringRedisTemplate = new StringRedisTemplate (); stringRedisTemplate.setConnectionFactory(factory); return stringRedisTemplate; } }
3.创建测试实体类 创建用于数据操作的测试实体类,见以下代码:
package com.intehel.demo.domain;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;@Data @NoArgsConstructor @AllArgsConstructor public class Person implements Serializable { private Long id; private String name; private Integer age; private String address; }
4. 实现实体和数据表的映射关系 package com.intehel.demo.mapper;import com.intehel.demo.domain.Person;import org.apache.ibatis.annotations.*;import org.springframework.stereotype.Repository;@Repository @Mapper public interface PersonMapper { @Insert("insert into person(name, age,address) values(#{name},#{age},#{address})") int addPerson (@Param("name") String name, @Param("age") String age, @Param("address") String address) ; @Select("select * from person where id = #{id}") Person findById (@Param("id") String id) ; @Update("update person set age = #{age},name = #{name},address = #{address} where id = #{id}") int updateById (Person person) ; @Delete("delete from person where id = #{id}") void deleteById (@Param("id") String id) ; }
5. 创建Redis缓存服务层 package com.intehel.demo.service;import com.intehel.demo.domain.Person;import com.intehel.demo.mapper.PersonMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheConfig;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Service @CacheConfig(cacheNames = "person") public class PersonService { @Autowired PersonMapper personMapper; @Cacheable(key = "#p0") public Person selectPerson (String id) { System.out.println("selectPerson" ); return personMapper.findById(id); } @CachePut(key = "#p0") public void updatePerson (Person person) { System.out.println("updatePerson" ); personMapper.updateById(person); } @CacheEvict(key = "#p0",allEntries = true) public void deletePerson (String id) { System.out.println("deletePerson" ); personMapper.deleteById(id);} }
代码解释如下。
@Cacheable:将查询结果缓存到Redis中。 key=”#p0”:指定传入的第1个参数作为Redis的key。 @CachePut:指定key, 将更新的结果同步到Redis中。 @CacheEvict:指定key, 删除缓存数据。 @allEntries=true:方法调用后将立即清除缓存 6.完成增加、删除、修改和查询测试API package com.intehel.demo.controller;import com.intehel.demo.service.PersonService;import com.intehel.demo.domain.Person;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/user") public class PersonController { @Autowired PersonService personService; @RequestMapping(value = "/{id}") public Person selectPerson (@PathVariable String id) { return personService.selectPerson(id); } @RequestMapping(value = "/update") public String updatePerson (@RequestBody Person person) { personService.updatePerson(person); return "success" ; } @RequestMapping(value = "/delete/{id}") public String deletePerson (@PathVariable String id) { personService.deletePerson(id); return "delete success" ; } }
启动项目,多次访问https://localhost:8080/user/1 第一次时控制台会出现select信息,代表对数据库进行了查询操作。后面再访问时则不会出现提示,表示没有对数据库执行操作,而是使用 Redis中的缓存数据。