SpringBoot整合Redis哨兵模式

文章目录

  • 1、Redis哨兵复习
  • 2、整合
  • 3、简单举例
  • 4、RedisTemplate详解
  • 5、补充

1、Redis哨兵复习

在这里插入图片描述

Redis哨兵主要有三点作用:

  • 监控:不断检查master和slave是否正常运行
  • 通知:当被监控的主从服务器发生问题时,向其他哨兵和客户端发送通知
  • 自动故障转移:断开master和slave的连接,选取一个slave做为master,将其他slave连接到新的maser,并导致客户端新的maser地址

关于Redis哨兵模式的搭建和详解,看这篇【CSDN-Redis哨兵模式】

2、整合

  • 在pom.xml文件中添加以下依赖:
<dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-data-redisartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-data-redisartifactId>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主节点名称
# spring.redis.sentinel.nodes的值为你的Redis哨兵节点列表。
  • 如果项目的配置文件用的yaml文件,则Redis配置的格式用下面这个
# 单哨兵
spring:redis:sentinel:master: mymasternodes: 192.168.43.243:26379lettuce:pool:max-idle: 10max-active: 20min-idle: 0max-wait: 10000ms
# 多哨兵,则nodes用数组格式,也就是横线
spring:redis:sentinel:master: your-redis-master  # 指定Redis的主节点名称nodes:  # 指定一个或多个哨兵节点的地址和端口号- host: your-sentinel1-hostport: your-sentinel1-port- host: your-sentinel2-hostport: your-sentinel2-port- host: your-sentinel3-hostport: your-sentinel3-portpassword: your-redis-password# 在哨兵模式中,Redis哨兵节点的配置通常与主节点保持一致,因为哨兵节点不存储数据,它们只负责监控节点的可用性。# 所以你不需要在哨兵节点的配置中指定用户名和密码,只需要在主节点的配置中指定密码即可

关于连接池的参数:

  • max-active:连接池中最大活跃连接数(默认值为8)。当连接数达到最大活跃连接数时,新的请求将会等待,直到有可用的连接为止。
  • max-idle:连接池中最大空闲连接数(默认值为8)。当空闲连接数超过最大空闲连接数时,多余的空闲连接将被释放。
  • min-idle:连接池中最小空闲连接数(默认值为0)。连接池中保持的最小空闲连接数,当请求连接时,如果空闲连接数不足,则会创建新的连接。
  • max-wait:连接池中获取连接的最大等待时间(默认-1,表示无限等待)。当连接池中的连接都被占用且达到最大活跃连接数时,新的请求会等待一段时间,如果超过最大等待时间,则会抛出异常。
  • test-on-create:在创建新的连接时,是否进行连接的测试验证(默认值为false)。如果设置为true,则在创建连接的时候会执行一次测试命令,确保连接可用。
  • test-on-borrow:在从连接池中借用连接时,是否进行连接的测试验证(默认值为false)。如果设置为true,则在从连接池中获取连接的时候会执行一次测试命令,确保连接可用。
  • test-on-return:在归还连接到连接池时,是否进行连接的测试验证(默认值为false)。如果设置为true,则在归还连接到连接池的时候会执行一次测试命令,确保连接可用。
  • test-while-idle:在连接空闲一段时间后,是否进行连接的测试验证(默认值为true)。如果设置为true,则连接空闲一段时间后会执行一次测试命令,确保连接可用。

最后,如果报错

"NOAUTH HELLO must be called with the client already HELLO" 

表明Redis连接需要进行认证,但是在发起 HELLO 命令之前没有进行认证。可以单独加下哨兵的密码:

spring.redis.sentinel.password=code9527

3、简单举例

  • 使用RedisTemplate或者使用注解的方式来访问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 {@Autowiredprivate 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是通过自动装配注入的,可以直接使用来操作Redis
  • 创建一个Controller类来处理请求并调用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 {@Autowiredprivate 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);}}

测试一下:
在这里插入图片描述

添加成功:

在这里插入图片描述

查询一下:

在这里插入图片描述

最后记录下一个我遇到的问题,哨兵拿到master的host时,host是个域名,我本地IDEA启动时不能解析成IP,报错:

在这里插入图片描述

可以先通过修改操作系统的Hosts文件来实现模拟域名和IP的关系:

C:\Windows\System32\drivers\etc在文件末尾添加一行,格式为 " <域名>"
例如: "127.0.0.1 mydomain.com".

4、RedisTemplate详解

RedisTemplate是Spring Data Redis提供的一个用于与Redis交互的高级工具类。它封装了与Redis服务器通信的底层细节,并提供了许多方便的方法来操作Redis的各种数据结构。

  • RedisTemplate基于Jedis或Lettuce等连接池技术,实现了与Redis服务器的连接和资源管理
  • 类中定义了一系列方法,可处理Redis的各种数据结构和执行各种Redis命令
  • RedisTemplate内部使用序列化器将Java对象转换为字节数组,并将其存储到Redis中。同时,还负责将从Redis中获取的字节数组转换回Java对象
//关于K,V
@Autowired
RedisTemplate<K,V> redisTemplate;

当使用RedisTemplate操作Redis时,K的类型通常是String类型,即键的数据类型为字符串。而V的类型可以是任意类型,取决于你存储的实际数据。RedisTemplate支持多种数据结构,例如字符串、哈希、列表、集合、有序集合等,因此V的类型可以是String、Hash、List、Set、ZSet等。

常用方法:

#1opsForValue()

返回一个用于操作String类型的ValueOperations对象,可以对Redis中的字符串键值对进行操作

#2opsForHash()

返回一个用于操作Hash类型的HashOperations对象,可以对Redis中的哈希数据结构进行操作

#3opsForList()

返回一个用于操作List类型的ListOperations对象,可以对Redis中的列表数据结构进行操作

#4opsForSet()

返回一个用于操作Set类型的SetOperations对象,可以对Redis中的集合数据结构进行操作

#5opsForZSet()

返回一个用于操作Sorted Set类型的ZSetOperations对象,可以对Redis中的有序集合数据结构进行操作


#6execute(RedisCallback)

用于执行自定义的Redis操作,可以通过实现RedisCallback接口来自定义要执行的操作

当你调用RedisTemplate的opsForValue()方法时,返回的实例可以用于操作字符串值;调用opsForHash()方法时,可以操作哈希类型的值;调用opsForList()方法时,可以操作列表类型的值;

总之就是,要操作什么类型的Redis数据,就调opsForxxx()方法获取什么类型的Operations对象,完了用这个对象调用set、get、hget等方法就行。

5、补充

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部