最近學習了一下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