SpringBoot整合Redis哨兵模式的實(shí)現(xiàn)示例
1、Redis哨兵復(fù)習(xí)

Redis哨兵主要有三點(diǎn)作用:
監(jiān)控:不斷檢查master和slave是否正常運(yùn)行通知:當(dāng)被監(jiān)控的主從服務(wù)器發(fā)生問(wèn)題時(shí),向其他哨兵和客戶端發(fā)送通知自動(dòng)故障轉(zhuǎn)移:斷開(kāi)master和slave的連接,選取一個(gè)slave做為master,將其他slave連接到新的maser,并導(dǎo)致客戶端新的maser地址
關(guān)于Redis哨兵模式的搭建和詳解,看這篇Redis哨兵模式
2、整合
- 在pom.xml文件中添加以下依賴(lài):
<dependencies>
<!-- Redis依賴(lài) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
- 在application.properties文件中添加以下Redis配置:
# Redis連接配置 spring.redis.sentinel.master=mymaster spring.redis.sentinel.nodes=host1:port1,host2:port2,host3:port3 # spring.redis.sentinel.master的值為你的Redis主節(jié)點(diǎn)名稱(chēng) # spring.redis.sentinel.nodes的值為你的Redis哨兵節(jié)點(diǎn)列表。
- 如果項(xiàng)目的配置文件用的yaml文件,則Redis配置的格式用下面這個(gè)
# 單哨兵
spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.43.243:26379
lettuce:
pool:
max-idle: 10
max-active: 20
min-idle: 0
max-wait: 10000ms
# 多哨兵,則nodes用數(shù)組格式,也就是橫線
spring:
redis:
sentinel:
master: your-redis-master # 指定Redis的主節(jié)點(diǎn)名稱(chēng)
nodes: # 指定一個(gè)或多個(gè)哨兵節(jié)點(diǎn)的地址和端口號(hào)
- host: your-sentinel1-host
port: your-sentinel1-port
- host: your-sentinel2-host
port: your-sentinel2-port
- host: your-sentinel3-host
port: your-sentinel3-port
password: your-redis-password
# 在哨兵模式中,Redis哨兵節(jié)點(diǎn)的配置通常與主節(jié)點(diǎn)保持一致,因?yàn)樯诒?jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),它們只負(fù)責(zé)監(jiān)控節(jié)點(diǎn)的可用性。
# 所以你不需要在哨兵節(jié)點(diǎn)的配置中指定用戶名和密碼,只需要在主節(jié)點(diǎn)的配置中指定密碼即可
關(guān)于連接池的參數(shù):
- max-active:連接池中最大活躍連接數(shù)(默認(rèn)值為8)。當(dāng)連接數(shù)達(dá)到最大活躍連接數(shù)時(shí),新的請(qǐng)求將會(huì)等待,直到有可用的連接為止。
- max-idle:連接池中最大空閑連接數(shù)(默認(rèn)值為8)。當(dāng)空閑連接數(shù)超過(guò)最大空閑連接數(shù)時(shí),多余的空閑連接將被釋放。
- min-idle:連接池中最小空閑連接數(shù)(默認(rèn)值為0)。連接池中保持的最小空閑連接數(shù),當(dāng)請(qǐng)求連接時(shí),如果空閑連接數(shù)不足,則會(huì)創(chuàng)建新的連接。
- max-wait:連接池中獲取連接的最大等待時(shí)間(默認(rèn)-1,表示無(wú)限等待)。當(dāng)連接池中的連接都被占用且達(dá)到最大活躍連接數(shù)時(shí),新的請(qǐng)求會(huì)等待一段時(shí)間,如果超過(guò)最大等待時(shí)間,則會(huì)拋出異常。
- test-on-create:在創(chuàng)建新的連接時(shí),是否進(jìn)行連接的測(cè)試驗(yàn)證(默認(rèn)值為false)。如果設(shè)置為true,則在創(chuàng)建連接的時(shí)候會(huì)執(zhí)行一次測(cè)試命令,確保連接可用。
- test-on-borrow:在從連接池中借用連接時(shí),是否進(jìn)行連接的測(cè)試驗(yàn)證(默認(rèn)值為false)。如果設(shè)置為true,則在從連接池中獲取連接的時(shí)候會(huì)執(zhí)行一次測(cè)試命令,確保連接可用。
- test-on-return:在歸還連接到連接池時(shí),是否進(jìn)行連接的測(cè)試驗(yàn)證(默認(rèn)值為false)。如果設(shè)置為true,則在歸還連接到連接池的時(shí)候會(huì)執(zhí)行一次測(cè)試命令,確保連接可用。
- test-while-idle:在連接空閑一段時(shí)間后,是否進(jìn)行連接的測(cè)試驗(yàn)證(默認(rèn)值為true)。如果設(shè)置為true,則連接空閑一段時(shí)間后會(huì)執(zhí)行一次測(cè)試命令,確保連接可用。
最后,如果報(bào)錯(cuò)
"NOAUTH HELLO must be called with the client already HELLO"
表明Redis連接需要進(jìn)行認(rèn)證,但是在發(fā)起 HELLO 命令之前沒(méi)有進(jìn)行認(rèn)證??梢詥为?dú)加下哨兵的密碼:
spring.redis.sentinel.password=code9527
3、簡(jiǎn)單舉例
- 使用RedisTemplate或者使用注解的方式來(lái)訪問(wèn)Redis。以下是使用RedisTemplate的示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private RedisTemplate redisTemplate;
public void saveUser(String username, String password) {
redisTemplate.opsForHash().put("users", username, password);
}
public String findUser(String username) {
return (String) redisTemplate.opsForHash().get("users", username);
}
}
//RedisTemplate是通過(guò)自動(dòng)裝配注入的,可以直接使用來(lái)操作Redis
- 創(chuàng)建一個(gè)Controller類(lèi)來(lái)處理請(qǐng)求并調(diào)用UserService中的方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/user/addRedis")
public void addUserToRedis(String username,String password){
userService.saveUser(username,password);
}
@GetMapping("/user/{username}")
public String getUser(@PathVariable String username) {
return userService.findUser(username);
}
}
測(cè)試一下:

添加成功:

查詢一下:

最后記錄下一個(gè)我遇到的問(wèn)題,哨兵拿到master的host時(shí),host是個(gè)域名,我本地IDEA啟動(dòng)時(shí)不能解析成IP,報(bào)錯(cuò):

可以先通過(guò)修改操作系統(tǒng)的Hosts文件來(lái)實(shí)現(xiàn)模擬域名和IP的關(guān)系:
C:\Windows\System32\drivers\etc 在文件末尾添加一行,格式為 "<IP地址> <域名>" 例如: "127.0.0.1 mydomain.com".
到此這篇關(guān)于SpringBoot整合Redis哨兵模式的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot Redis哨兵 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基礎(chǔ)之初始化ArrayList時(shí)直接賦值的4種方式總結(jié)
ArrayList是Java中的一個(gè)類(lèi),它是Java集合框架中的一部分,用于實(shí)現(xiàn)動(dòng)態(tài)數(shù)組,下面這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)之初始化ArrayList時(shí)直接賦值的4種方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
RabbitMQ @RabbitListener 與 @RabbitHandl
本文將深入探討這兩個(gè)注解的區(qū)別、使用方法、最佳實(shí)踐以及常見(jiàn)問(wèn)題,幫助開(kāi)發(fā)者更好地理解和應(yīng)用 RabbitMQ 在 Spring Boot 項(xiàng)目中的消息處理機(jī)制,感興趣的朋友跟隨小編一起看看吧2026-03-03
SpringBoot通過(guò)ThreadLocal實(shí)現(xiàn)登錄攔截詳解流程
這篇文章主要介紹了SpringBoot(HandlerInterceptor)+ThreadLocal實(shí)現(xiàn)登錄攔截,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Java及nginx實(shí)現(xiàn)文件權(quán)限控制代碼實(shí)例
這篇文章主要介紹了Java及nginx實(shí)現(xiàn)文件權(quán)限控制代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Java中Properties類(lèi)的操作實(shí)例詳解
這篇文章主要介紹了Java中Properties類(lèi)的操作實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
關(guān)于MyBaties的基本配置標(biāo)簽總結(jié)
今天給大家?guī)?lái)的是關(guān)于MyBaties基礎(chǔ)的相關(guān)知識(shí),文章圍繞著MyBaties的基本配置標(biāo)簽展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
移動(dòng)開(kāi)發(fā)Spring Boot外置tomcat教程及解決方法
這篇文章主要介紹了移動(dòng)開(kāi)發(fā)SpringBoot外置tomcat教程,需要的朋友可以參考下2017-11-11
基于MybatisPlus插件TenantLineInnerInterceptor實(shí)現(xiàn)多租戶功能
這篇文章主要介紹了基于MybatisPlus插件TenantLineInnerInterceptor實(shí)現(xiàn)多租戶功能,需要的朋友可以參考下2021-11-11

