SpringBoot集成Redis之RedisTemplate實(shí)踐
1. 依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>2. 配置
# ========================redis單機(jī)===================== spring.data.redis.database=0 spring.data.redis.host=192.168.229.102 spring.data.redis.port=6379 spring.data.redis.lettuce.pool.max-active=8 spring.data.redis.lettuce.pool.max-wait=-1ms spring.data.redis.lettuce.pool.max-idle=8 spring.data.redis.lettuce.pool.min-idle=0
3. 簡(jiǎn)單使用
package com.example.redis;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.UUID;
@SpringBootTest
class RedisApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
private static final String ORDER_KEY = "order: ";
@Test
public void setKey() {
int keyId = 1;
String key = ORDER_KEY + keyId;
String serialNo = UUID.randomUUID().toString();
String value = "訂單" + serialNo;
redisTemplate.opsForValue().set(key, value);
System.out.println("添加訂單成功,訂單編號(hào):" + key);
System.out.println("訂單信息:" + value);
}
@Test
public void getKey() {
int keyId = 1;
String key = ORDER_KEY + keyId;
String value = (String) redisTemplate.opsForValue().get(key);
System.out.println("訂單信息:" + value);
}
}
4. 問(wèn)題
上面代碼setKey得到結(jié)果如圖所示

在redis中查看這個(gè)key
![]()
可以看到出現(xiàn)了亂碼。
Redis中的key和value均是以二進(jìn)制的形式存儲(chǔ)的,因此客戶(hù)端輸入的key和value都會(huì)經(jīng)過(guò)序列化之后才發(fā)往Redis服務(wù)端。而RedisTemplate所使用序列化方式和命令行客戶(hù)端采用序列化方式不相同,進(jìn)而導(dǎo)致序列化之后的二進(jìn)制數(shù)據(jù)不同,所以才會(huì)導(dǎo)致上述的現(xiàn)象。

5. 解決
方法一:使用StringRedisTemplate
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void setKey1() {
int keyId = 2;
String key = ORDER_KEY + keyId;
String serialNo = UUID.randomUUID().toString();
String value = "訂單" + serialNo;
stringRedisTemplate.opsForValue().set(key, value);
System.out.println("添加訂單成功,訂單編號(hào):" + key);
System.out.println("訂單信息:" + value);
}
![]()
但此時(shí)發(fā)現(xiàn)中文仍是亂碼
![]()
此時(shí)啟動(dòng)redis客戶(hù)端時(shí)加上 --raw 即可

方法二:自定義配置redis序列化器
RedisTemplate默認(rèn)使用JDK序列化方式,StringRedisTemplate使用String序列化方式

因此我們可以仿照StringRedisTemplate自定義redis配置,將序列化方式設(shè)為合適類(lèi)型
package com.example.redis.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(RedisSerializer.string());
template.setValueSerializer(RedisSerializer.json());
template.setHashKeySerializer(RedisSerializer.string());
template.setHashValueSerializer(RedisSerializer.json());
return template;
}
}

6. 連接集群
改變配置
# ========================redis集群===================== # 獲取失敗 最大重定向次數(shù) spring.data.redis.cluster.max-redirects=3 spring.data.redis.lettuce.pool.max-active=8 spring.data.redis.lettuce.pool.max-wait=-1ms spring.data.redis.lettuce.pool.max-idle=8 spring.data.redis.lettuce.pool.min-idle=0 spring.data.redis.cluster.nodes=192.168.111.175:6381,192.168.111.175:6382,192.168.111.172:6383,192.168.111.172:6384,192.168.111.174:6385,192.168.111.174:6386
當(dāng)集群中的一個(gè)主機(jī)意外宕機(jī),集群能自動(dòng)感知并自動(dòng)完成主備切換,但SpringBoot客戶(hù)端沒(méi)有動(dòng)態(tài)感知到集群的最新信息
解決方案:
- 調(diào)用RedisClusterClient.reloadPartitions
- 后臺(tái)基于時(shí)間間隔的周期刷新
- 后臺(tái)基于持續(xù)的 斷開(kāi) 和 移動(dòng)、重定向 的自適應(yīng)更新
# ========================redis集群===================== # 獲取失敗 最大重定向次數(shù) spring.data.redis.cluster.max-redirects=3 spring.data.redis.lettuce.pool.max-active=8 spring.data.redis.lettuce.pool.max-wait=-1ms spring.data.redis.lettuce.pool.max-idle=8 spring.data.redis.lettuce.pool.min-idle=0 spring.data.redis.cluster.nodes=192.168.111.175:6381,192.168.111.175:6382,192.168.111.172:6383,192.168.111.172:6384,192.168.111.174:6385,192.168.111.174:6386 #支持集群拓?fù)鋭?dòng)態(tài)感應(yīng)刷新,自適應(yīng)拓?fù)渌⑿率欠袷褂盟锌捎玫母?,默認(rèn)false關(guān)閉 spring.data.redis.lettuce.cluster.refresh.adaptive=true #定時(shí)刷新 spring.data.redis.lettuce.cluster.refresh.period=2000
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot集成RedisTemplate的實(shí)現(xiàn)示例
- SpringBoot3.4.0無(wú)法找到StringRedisTemplate?bean的問(wèn)題Consider?defining?a?bean?of?type?‘org.springframework
- SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控的基本操作
- SpringBoot引入Redis報(bào)org.springframework.data.redis.core.RedisTemplate類(lèi)找不到錯(cuò)誤問(wèn)題
- Springboot中RedisTemplate設(shè)置String、Hash、List過(guò)期時(shí)間
相關(guān)文章
防止未登錄用戶(hù)操作—基于struts2攔截器的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇防止未登錄用戶(hù)操作—基于struts2攔截器的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Java8新特性之lambda的作用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
我們期待了很久lambda為java帶來(lái)閉包的概念,但是如果我們不在集合中使用它的話(huà),就損失了很大價(jià)值。現(xiàn)有接口遷移成為lambda風(fēng)格的問(wèn)題已經(jīng)通過(guò)default methods解決了,在這篇文章將深入解析Java集合里面的批量數(shù)據(jù)操作解開(kāi)lambda最強(qiáng)作用的神秘面紗。2017-06-06
Java如何導(dǎo)出數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)表到指定文件夾
這篇文章主要介紹了Java導(dǎo)出數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)表到指定文件夾,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Java中為什么this可以調(diào)用當(dāng)前實(shí)例
本文主要介紹了為什么可以通過(guò)this關(guān)鍵字訪問(wèn)到當(dāng)前對(duì)象呢,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Springboot Mybatis-Plus數(shù)據(jù)庫(kù)單元測(cè)試實(shí)戰(zhàn)(三種方式)
這篇文章主要介紹了Springboot Mybatis-Plus數(shù)據(jù)庫(kù)單元測(cè)試實(shí)戰(zhàn)(三種方式),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
淺談java面向?qū)ο?類(lèi),封裝,this,構(gòu)造方法)
下面小編就為大家?guī)?lái)一篇淺談java面向?qū)ο?類(lèi),封裝,this,構(gòu)造方法)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
java開(kāi)發(fā)分布式服務(wù)框架Dubbo服務(wù)引用過(guò)程詳解
這篇文章主要為大家介紹了java開(kāi)發(fā)分布式服務(wù)框架Dubbo服務(wù)引用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
WebsocketClient斷線(xiàn)的一些常見(jiàn)原因及解決辦法
這篇文章主要給大家介紹了關(guān)于WebsocketClient斷線(xiàn)的一些常見(jiàn)原因及解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用WebsocketClient斷線(xiàn)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12

