SpringBoot整合Redis的實現(xiàn)示例
1.需求說明
- 在 springboot 中 , 整合 redis
- 可以通過 RedisTemplate 完成對 redis 的操作, 包括設(shè)置數(shù)據(jù)/獲取數(shù)據(jù)
- 比如添加和讀取數(shù)據(jù)
2.整合實現(xiàn)
2.1.創(chuàng)建Springboot工程
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring2.X 集成 redis 所需 common-pool-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<!--不要帶版本號,防止沖突-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2.2</version>
</dependency>
2.2.redis配置
配置連接信息
spring:
redis:
host: 192.168.79.202
port: 6379
#Redis 數(shù)據(jù)庫索引(默認(rèn)為 0)
database: 0
#連接超時時間(毫秒)
timeout: 1800000
lettuce:
pool:
#連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
max-active: 20
#最大阻塞等待時間(負(fù)數(shù)表示沒限制)
max-wait: -1
#連接池中的最大空閑連接
min-idle: 0
#密碼
password: foobared
redis 配置類
如果不配置, springboot 會使用默認(rèn)配置, 這個默認(rèn)配置, 會出現(xiàn)一些問題, 比如:
redisTemplate 的 key 序列化等, 問題所以通常我們需要配置
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template =
new RedisTemplate<>();
//這里可以驗證..
//System.out.println("template=>" + template);
RedisSerializer<String> stringRedisSerializer =
new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(stringRedisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> stringRedisSerializer =
new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解決查詢緩存轉(zhuǎn)換異常的問題
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解決亂碼的問題),過期時間600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
3.編寫測試類
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
@Resource
private RedisTemplate redisTemplate;
//編寫一個測試方法,演示設(shè)置數(shù)據(jù)和獲取數(shù)據(jù)
@GetMapping("/t1")
public String t1(){
//設(shè)置值到redis
redisTemplate.opsForValue().set("book","西游記");
//從redis獲取值
String book = (String)redisTemplate.opsForValue().get("book");
return book;
}
}
測試結(jié)果


//編寫方法,演示如何操作list,hash,set,zset
//opsForList、opsForHash、opsForSet、opsForZSet
@GetMapping("/t2")
public String t2(){
redisTemplate.opsForList().leftPushAll("books","西游記","java");
List books = redisTemplate.opsForList().range("books", 0, -1);
StringBuilder builder = new StringBuilder();
for (Object book : books) {
builder.append(book.toString()).append(" ");
System.out.println("書名:"+book.toString());
}
return builder.toString();
}
輸出結(jié)果
書名:java
書名:西游記
4.注意事項和細(xì)節(jié)
1、如果沒有提供 RedisConfig 配置類 , springboot 會使用默認(rèn)配置, 也可以使用
2、如果沒有提供 RedisConfig 配置類 , springboot 會使用默認(rèn)配置, 但是會存在問題,比如 redisTemplate 模糊查找 key 數(shù)據(jù)為空
//編寫一個方法獲取所有的key
@GetMapping("/t3")
public String t3(){
Set keys = redisTemplate.keys("*");
System.out.println(keys.size());
System.out.println(keys);
return "ok";
}
//輸出結(jié)果
0
[]3、Unrecognized token ‘beijing’: was expecting (‘true’, ‘false’ or ‘null’)看報錯,是 jason 轉(zhuǎn)換異常,實際上是因為 redisTemplate 在做數(shù)據(jù)存儲的時候會把存儲的內(nèi)容序列化,所以,redisTemplate 讀取的時候也會反序列化,而在 redis 客戶端set 的時候并不會做序列化,因此 set 的進(jìn)去的值在用 redisTemplate 讀的時候就會報類型轉(zhuǎn)換異常了

//編寫方法獲取客戶端設(shè)置的key
//問題描述:在客戶端設(shè)置了key,通過redisTemplate獲取會報錯
@GetMapping("/t4")
public String t4(){
String name = (String)redisTemplate.opsForValue().get("name");
System.out.println("name = "+name);
return name;
}

4、解決方案 : 最簡單的就是用程序重新 set 一遍即可
到此這篇關(guān)于SpringBoot整合Redis的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot整合Redis內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)爬取往期所有雙色球開獎結(jié)果功能示例
這篇文章主要介紹了Java實現(xiàn)爬取往期所有雙色球開獎結(jié)果功能,涉及Java網(wǎng)頁抓取、正則替換、文件讀寫等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
解決Request獲取請求數(shù)據(jù)中文亂碼問題
這篇文章主要介紹了Request獲取請求數(shù)據(jù)中文亂碼問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot如何實現(xiàn)starter原理詳解
這篇文章主要介紹了SpringBoot如何實現(xiàn)starter原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
Java關(guān)鍵字this(動力節(jié)點Java學(xué)院整理)
java中的this隨處可見,用法也多。通常情況下理解this關(guān)鍵字還是很容易的,但是在我初學(xué)的時候,有一個疑問卻一直不能很清晰的理解,現(xiàn)在慢慢的理解了,下面通過本文給大家記錄下,有需要的朋友參考下2017-03-03
spring security中的csrf防御原理(跨域請求偽造)
這篇文章主要介紹了spring security中的csrf防御機制原理解析(跨域請求偽造),本文通過實例代碼詳解的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
Springboot @Configuration與自動配置詳解
這篇文章主要介紹了SpringBoot中的@Configuration自動配置,在進(jìn)行項目編寫前,我們還需要知道一個東西,就是SpringBoot對我們的SpringMVC還做了哪些配置,包括如何擴展,如何定制,只有把這些都搞清楚了,我們在之后使用才會更加得心應(yīng)手2022-07-07
SpringBoot測試時卡在Resolving Maven dependencies的問題
這篇文章主要介紹了SpringBoot測試時卡在Resolving Maven dependencies的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

