一、引入Redis
1、項目中集成Redis
service-base模塊中添加redis依賴,Spring Boot 2.0以上默認通過commons-pool2連接池連接Redis
<!-- spring boot redis緩存引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 緩存連接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- redis 存儲 json序列化 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
2、添加Redis連接配置
service-core 的 application.yml 中添加如下配置
放到 spring 下面
#spring:
redis:
host: 192.168.100.100
port: 6379
database: 0
password: 123456 #默認為空
timeout: 3000ms #最大等待時間,超時則拋出異常,否則請求一直等待
lettuce:
pool:
max-active: 20 #最大連接數,負值表示沒有限制,默認8
max-wait: -1 #最大阻塞等待時間,負值表示沒限制,默認-1
max-idle: 8 #最大空閑連接,默認8
min-idle: 0 #最小空閑連接,默認0
3、啟動Redis服務
遠程連接Linux服務器
#啟動服務
cd /usr/local/redis-5.0.7
bin/redis-server redis.conf
二、測試RedisTemplate
1、存值測試
test中創建測試類RedisTemplateTests
package com.atguigu.srb.core;
@SpringBootTest
@RunWith(SpringRunner.class)
public class RedisTemplateTests {
@Resource
private RedisTemplate redisTemplate;
@Resource
private DictMapper dictMapper;
@Test
public void saveDict(){
Dict dict = dictMapper.selectById(1);
//向數據庫中存儲string類型的鍵值對, 過期時間5分鍾
redisTemplate.opsForValue().set("dict", dict, 5, TimeUnit.MINUTES);
}
}
發現RedisTemplate默認使用了JDK的序列化方式存儲了key和value
2、Redis配置文件
service-base 中添加RedisConfig,我們可以在這個配置文件中配置Redis序列化方案
package com.atguigu.srb.base.config;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//首先解決key的序列化方式
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
//解決value的序列化方式
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//序列化時將類的數據類型存入json,以便反序列化的時候轉換成正確的類型
ObjectMapper objectMapper = new ObjectMapper();
//objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// 將當前對象的數據類型也存入序列化的結果字符串中,以便反序列化
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
// 解決jackson2無法反序列化LocalDateTime的問題
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.registerModule(new JavaTimeModule());
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
再次測試,key使用了字符串存儲,value使用了json存儲
3、取值測試
@Test
public void getDict(){
Dict dict = (Dict)redisTemplate.opsForValue().get("dict");
System.out.println(dict);
}