最近学习了一下redis,并与SpringBoot进行了整合,在此与你们分享。html
关于Redis的解释网上有不少,我在这里不作出多余解释,你们能够自行搜索,我在这里要提到的是,Redis与SpringBoot整合有两种方式,第一种是使用Jedis,它是Redis官方推荐的面向Java的操做Redis的客户端,第二种是使用RedisTemplate,它是SpringDataRedis中对JedisApi的高度封装。我这次使用的是RedisTemplate,并整理了redis工具类方便你们使用,GitHub地址文末给出。java
我在此贴出项目目录结构,方便你们观察:mysql
此项目使用SpringBoot版本为2.1.3.RELEASE,下面引入依赖:git
<!-- mysql依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency>
<!-- mybatis依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency>
<!-- redis依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<!-- 日志 --> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
使用JDK1.8github
<properties> <java.version>1.8</java.version> </properties>
至此,pom文件已经准备好。redis
application.properties文件以下:spring
1 server.port=8088 2 mybatis.type-aliases-package=com.neo.entity 3 spring.datasource.driverClassName = com.mysql.jdbc.Driver 4 spring.datasource.url= jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=false 5 spring.datasource.username = root 6 spring.datasource.password = yingziairen 7 logging.level.root=info
application.yml文件以下,其中配置了Mybatis:sql
1 mybatis: 2 typeAliasesPackage: com.cone.redis.entity 3 mapperLocations: classpath:mapper/*.xml
当添加Redis依赖后,SpringBoot会自动帮咱们在容器中生成一个RedisTemplate和一个StringRedisTemplate,可是,这个RedisTemplate的泛型是<Object,Object>,在代码中会不可避免的须要类型转换,这样不够安全,也过于麻烦,并且RedisTemplate没有设置序列化方式,因此,咱们须要配置Redis:数据库
1 @Bean 2 @SuppressWarnings("all") 3 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { 4 5 RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); 6 template.setConnectionFactory(factory); 7 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); 8 ObjectMapper om = new ObjectMapper(); 9 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 10 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 11 jackson2JsonRedisSerializer.setObjectMapper(om); 12 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); 13 //key采用String的序列化方式 14 template.setKeySerializer(stringRedisSerializer); 15 //hash的key也采用String的序列化方式 16 template.setHashKeySerializer(stringRedisSerializer); 17 //value序列化方式采用jackson 18 template.setValueSerializer(jackson2JsonRedisSerializer); 19 //hash的value序列化方式采用jackson 20 template.setHashValueSerializer(jackson2JsonRedisSerializer); 21 template.afterPropertiesSet(); 22 return template; 23 }
这张表是我其它项目的,这里用来举例:(项目中有sql语句文件,可本身在本地测试)apache
1 package com.cone.redis.entity; 2 3 /** 4 * 图书信息实体 5 * @author Cone 6 */ 7 public class Product { 8 9 private Integer productId; 10 private String productCategories; 11 12 public Integer getProductId() { 13 return productId; 14 } 15 public void setProductId(Integer productId) { 16 this.productId = productId; 17 } 18 public String getProductCategories() { 19 return productCategories; 20 } 21 public void setProductCategories(String productCategories) { 22 this.productCategories = productCategories; 23 } 24 25 }
项目使用Mybatis操做数据库:
1 package com.cone.redis.dao; 2 3 import java.util.List; 4 import org.apache.ibatis.annotations.Mapper; 5 import com.cone.redis.entity.Product; 6 7 @Mapper 8 public interface ProductDao { 9 /** 10 * 查询图书列表 11 * @return 12 */ 13 public List<Product> searchProduct(); 14 }
xml文件以下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 <mapper namespace="com.cone.redis.dao.ProductDao"> 4 <!-- 查询图书类别 --> 5 <select id="searchProduct" resultType="com.cone.redis.entity.Product"> 6 7 select * from product 8 9 </select> 10 11 12 </mapper>
1 package com.cone.redis.service; 2 3 import java.util.List; 4 import com.cone.redis.entity.Product; 5 6 7 public interface RedisService { 8 9 public List<Product> searchProduct(); 10 11 }
实现类以下:
①首先注入相关Bean
1 @Autowired 2 private RedisUtil.redisList redisList; 3 4 @Autowired 5 private RedisUtil redisUtil; 6 7 @Autowired 8 private ProductDao productDao;
RedisUtil是个人工具类,这里你们只须要知道这个便可。
②实现
1 @Override 2 public List searchProduct() { 3 4 List list = new ArrayList<>(); 5 if (redisUtil.hasKey("productList")) { 6 log.info("从redis中获取数据."); 7 list = redisList.get("productList", 0, -1); 8 9 } 10 else { 11 list = productDao.searchProduct(); 12 log.info("从数据库中获取数据."); 13 log.info("将数据存入redis..."); 14 redisList.set("productList", list); 15 log.info("成功存入redis."); 16 } 17 return list; 18 }
首先判断redis中有没有相关数据,如有,则从redis中查询并返回数据,若没有则从数据库中查询,并将查询到的数据存入redis中。
1 @Controller 2 @RequestMapping(value="/redis") 3 4 public class RedisController { 5 6 @Autowired 7 private RedisServiceImpl redisServiceImpl; 8 9 @SuppressWarnings("unchecked") 10 @PostMapping(value = "/test") 11 @ResponseBody 12 public List<Product> testRedis() { 13 14 return redisServiceImpl.searchProduct(); 15 16 } 17 18 }
至此,项目编写完毕。
网上确实有不少的Redis工具类,可是编写过于冗余,方法太多不方便使用,我使用成员内部类实现了一个工具类,具备相同特性的方法放在一块儿,归类List、Map、String、Set的操做。由于工具类代码较多,这里就不贴出来了,你们能够去GitHub上查看。
使用postman进行接口测试,对地址http://localhost:8088/redis/test进行访问,由于刚开始Redis中没有相关数据,因此会从数据库中查询,控制台证明了这一点:
观察postman发现确实拿到了数据:
如今咱们再次测试接口:
操做成功,使用Redis桌面管理工具能够查看数据:
得益于SpringBoot,咱们能够方便的为系统集成一些功能,我还写过一个Spring整合Jedis的项目,实现上大同小异,据说Jedis的效率更高,这点我还未证明。写这篇博客参考了不少人的博文,感谢他们,下面是部分参考连接:
https://www.cnblogs.com/zeng1994/p/03303c805731afc9aa9c60dbbd32a323.html
此项目GitHub地址以下:
https://github.com/Thinker-Mars/Demo