哨兵机制下,客户端如何执行命令的?
Redis哨兵模式下,提供了查询master的ip,port的命令,所以我们可以通过命令拿到ip,port连接到redis master节点,执行命令。
127.0.0.1:26379> sentinel slaves mymaster # 查看指定的从节点状态及相关统计信息
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster # 返回主节点的IP和端口
如果master故障了,依赖哨兵进行故障转移,master重新选举,保证了redis的高可用。 那么上述功能,可以封装成一个插件,即插即用,说到这里,我们想到了SpringBoot的starter,查找下Spring有没有提供,果然 有spring-boot-starter-data-redis,使用方法网上搜下就有了。
ps: 在 springboot 1.5.x版本的默认的Redis客户端是 Jedis实现的,springboot 2.x版本中默认客户端是用 lettuce实现的,推荐用后者了。
Jedis 在实现上是直连 redis server,多线程环境下非线程安全,除非使用连接池,为每个 redis实例增加物理连接。
Lettuce 是 一种可伸缩,线程安全,完全非阻塞的Redis客户端,多个线程可以共享一个RedisConnection,它利用Netty NIO 框架来高效地管理多个连接,从而提供了异步和同步数据访问方式,用于构建非阻塞的反应性应用程序。
哨兵机制注意事项
- 如果master宕机了,则会启动重新选主,在选主过程中,redis不接受命令,即不可用。
- 如果slave宕机了,如果有客户端连接上了,哨兵不会故障转移的,所以做redis读写分离的时候要注意这个问题。
- spring-boot-starter-data-redis 的创建的是master节点连接池,并不能做到读写分离,需要自己实现