SpringBoot整合Redis的實(shí)現(xiàn)示例
1.需求說(shuō)明
- 在 springboot 中 , 整合 redis
- 可以通過(guò) RedisTemplate 完成對(duì) redis 的操作, 包括設(shè)置數(shù)據(jù)/獲取數(shù)據(jù)
- 比如添加和讀取數(shù)據(jù)
2.整合實(shí)現(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> <!--不要帶版本號(hào),防止沖突--> </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ù)庫(kù)索引(默認(rèn)為 0) database: 0 #連接超時(shí)時(shí)間(毫秒) timeout: 1800000 lettuce: pool: #連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制) max-active: 20 #最大阻塞等待時(shí)間(負(fù)數(shù)表示沒(méi)限制) max-wait: -1 #連接池中的最大空閑連接 min-idle: 0 #密碼 password: foobared
redis 配置類
如果不配置, springboot 會(huì)使用默認(rèn)配置, 這個(gè)默認(rèn)配置, 會(huì)出現(xiàn)一些問(wèn)題, 比如:
redisTemplate 的 key 序列化等, 問(wèn)題所以通常我們需要配置
@EnableCaching @Configuration public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); //這里可以驗(yàn)證.. //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)換異常的問(wè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); // 配置序列化(解決亂碼的問(wèn)題),過(guò)期時(shí)間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.編寫(xiě)測(cè)試類
@RestController @RequestMapping("/redisTest") public class RedisTestController { @Resource private RedisTemplate redisTemplate; //編寫(xiě)一個(gè)測(cè)試方法,演示設(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; } }
測(cè)試結(jié)果
//編寫(xiě)方法,演示如何操作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("書(shū)名:"+book.toString()); } return builder.toString(); }
輸出結(jié)果
書(shū)名:java
書(shū)名:西游記
4.注意事項(xiàng)和細(xì)節(jié)
1、如果沒(méi)有提供 RedisConfig 配置類 , springboot 會(huì)使用默認(rèn)配置, 也可以使用
2、如果沒(méi)有提供 RedisConfig 配置類 , springboot 會(huì)使用默認(rèn)配置, 但是會(huì)存在問(wèn)題,比如 redisTemplate 模糊查找 key 數(shù)據(jù)為空
//編寫(xiě)一個(gè)方法獲取所有的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’)看報(bào)錯(cuò),是 jason 轉(zhuǎn)換異常,實(shí)際上是因?yàn)?redisTemplate 在做數(shù)據(jù)存儲(chǔ)的時(shí)候會(huì)把存儲(chǔ)的內(nèi)容序列化,所以,redisTemplate 讀取的時(shí)候也會(huì)反序列化,而在 redis 客戶端set 的時(shí)候并不會(huì)做序列化,因此 set 的進(jìn)去的值在用 redisTemplate 讀的時(shí)候就會(huì)報(bào)類型轉(zhuǎn)換異常了
//編寫(xiě)方法獲取客戶端設(shè)置的key //問(wèn)題描述:在客戶端設(shè)置了key,通過(guò)redisTemplate獲取會(huì)報(bào)錯(cuò) @GetMapping("/t4") public String t4(){ String name = (String)redisTemplate.opsForValue().get("name"); System.out.println("name = "+name); return name; }
4、解決方案 : 最簡(jiǎn)單的就是用程序重新 set 一遍即可
到此這篇關(guān)于SpringBoot整合Redis的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot整合Redis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)爬取往期所有雙色球開(kāi)獎(jiǎng)結(jié)果功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)爬取往期所有雙色球開(kāi)獎(jiǎng)結(jié)果功能,涉及Java網(wǎng)頁(yè)抓取、正則替換、文件讀寫(xiě)等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07解決Request獲取請(qǐng)求數(shù)據(jù)中文亂碼問(wèn)題
這篇文章主要介紹了Request獲取請(qǐng)求數(shù)據(jù)中文亂碼問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot如何實(shí)現(xiàn)starter原理詳解
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)starter原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java關(guān)鍵字this(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
java中的this隨處可見(jiàn),用法也多。通常情況下理解this關(guān)鍵字還是很容易的,但是在我初學(xué)的時(shí)候,有一個(gè)疑問(wèn)卻一直不能很清晰的理解,現(xiàn)在慢慢的理解了,下面通過(guò)本文給大家記錄下,有需要的朋友參考下2017-03-03spring security中的csrf防御原理(跨域請(qǐng)求偽造)
這篇文章主要介紹了spring security中的csrf防御機(jī)制原理解析(跨域請(qǐng)求偽造),本文通過(guò)實(shí)例代碼詳解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Springboot @Configuration與自動(dòng)配置詳解
這篇文章主要介紹了SpringBoot中的@Configuration自動(dòng)配置,在進(jìn)行項(xiàng)目編寫(xiě)前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手2022-07-07SpringBoot測(cè)試時(shí)卡在Resolving Maven dependencies的問(wèn)題
這篇文章主要介紹了SpringBoot測(cè)試時(shí)卡在Resolving Maven dependencies的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02小白也可以學(xué)會(huì)的Java NIO的Write事件
剛開(kāi)始對(duì)NIO的寫(xiě)操作理解的不深,不知道為什么要注冊(cè)寫(xiě)事件,何時(shí)注冊(cè)寫(xiě)事件,為什么寫(xiě)完之后要取消注冊(cè)寫(xiě)事件,今天特地整理了本篇文章,需要的朋友可以參考下2021-06-06