项目服务中的redis周期性的会超时断掉链接,根据redis内部原理处理。
Redis 内部使用文件事件处理器
file event handler
,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分:
- 多个 socket
- IO 多路复用程序
- 文件事件分派器
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
之前文章的补充
lettuce集群代码
RedisClusterClient redisClusterClient = RedisClusterClient.create(nodes);
SocketOptions socketOptions = SocketOptions.builder()
.keepAlive(SocketOptions.KeepAliveOptions.builder()
.enable() // 启用 TCP Keepalive 机制
.idle(Duration.ofSeconds(300)) // 连接空闲多久后开始发送 Keepalive 探测包(默认 2 小时)
.interval(Duration.ofSeconds(30)) // 两次 Keepalive 探测包之间的间隔时间(默认 75 秒)
.count(3) // 最多发送多少个 Keepalive 探测包(默认 9 个)
.build())
.tcpUserTimeout(SocketOptions.TcpUserTimeoutOptions.builder()
.enable() // 启用 TCP User Timeout 机制
.tcpUserTimeout(Duration.ofSeconds(10)) // 数据发送超时时间(默认 10 秒)
.build())
.build();
redisClusterClient.setOptions(ClusterClientOptions.builder()
.autoReconnect(true) // 启用自动重连
.validateClusterNodeMembership(true) // 验证集群节点成员资格
.topologyRefreshOptions(ClusterTopologyRefreshOptions.builder()
.enablePeriodicRefresh(true) // 启用周期性拓扑刷新
.refreshPeriod(java.time.Duration.ofSeconds(30)) // 每30秒刷新一次
.build())
.socketOptions(socketOptions) // 设置套接字选项
.build());
实例
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
.enablePeriodicRefresh(true) // 启用周期性拓扑刷新
.refreshPeriod(java.time.Duration.ofSeconds(30)) // 每30秒刷新一次
.build();
SocketOptions socketOptions = SocketOptions.builder()
.keepAlive(SocketOptions.KeepAliveOptions.builder()
.enable() // 启用 TCP Keepalive 机制
.idle(Duration.ofSeconds(300)) // 连接空闲多久后开始发送 Keepalive 探测包(默认 2 小时)
.interval(Duration.ofSeconds(30)) // 两次 Keepalive 探测包之间的间隔时间(默认 75 秒)
.count(3) // 最多发送多少个 Keepalive 探测包(默认 9 个)
.build())
.tcpUserTimeout(SocketOptions.TcpUserTimeoutOptions.builder()
.enable() // 启用 TCP User Timeout 机制
.tcpUserTimeout(Duration.ofSeconds(10)) // 数据发送超时时间(默认 10 秒)
.build())
.build();
// Configure ClusterClientOptions
ClusterClientOptions options = ClusterClientOptions.builder()
.autoReconnect(true) // Enable auto-reconnect
.disconnectedBehavior(ClusterClientOptions.DisconnectedBehavior.REJECT_COMMANDS) // Reject commands when disconnected
.socketOptions(socketOptions)
.topologyRefreshOptions(topologyRefreshOptions) // Set topology refresh options
.build();
RedisClient redisClient = RedisClient.create(nodes.get(0));
redisClient.setOptions(options);