Redis 客户端中引入 TCP Keepalive 的机制

项目服务中的redis周期性的会超时断掉链接,根据redis内部原理处理。

Redis 内部使用文件事件处理器 file event handler ,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

  • 多个 socket
  • IO 多路复用程序
  • 文件事件分派器
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

之前文章的补充

Redis配置lettuce集群jedis哨兵

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值