客户端宕机后 Redis 服务端如何感知到?
每个客户端在 Redis 中维护一个特定的键(称为心跳键),用于表示客户端的健康状态。该键具有一个设置的超时时间,例如 10 秒。
客户端定期(如每 5 秒)更新这个心跳键的超时时间,保持它的存活状态,通常通过 SET 命令重设键的过期时间。
import redis.clients.jedis.Jedis;
public class ClientHeartbeat {
private static final String HEARTBEAT_KEY = "client:heartbeat";
private static final int EXPIRE_TIME = 10; // 10秒
public static void main(String[] args) {
// 创建 Redis 连接
Jedis jedis = new Jedis("localhost");
// 定时更新心跳键
while (true) {
try {
// 设置心跳键并设置过期时间
jedis.setex(HEARTBEAT_KEY, EXPIRE_TIME, "alive");
// 打印心跳日志
System.out.println("Heartbeat sent.");
// 等待一段时间后再次发送心跳
Thread.sleep(5000); // 每5秒发送一次心跳
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}
Redis 服务端定期检查这个心跳键。如果发现该键已超时并被 Redis 自动删除,说明客户端可能已宕机。
import redis.clients.jedis.Jedis;
public class ServerMonitor {
private static final String HEARTBEAT_KEY = "client:heartbeat";
public static void main(String[] args) {
// 创建 Redis 连接
Jedis jedis = new Jedis("localhost");
// 定期检查心跳键
while (true) {
try {
// 检查心跳键是否存在
if (jedis.exists(HEARTBEAT_KEY)) {
System.out.println("Client is alive.");
} else {
System.out.println("Client is down or disconnected.");
}
// 每隔一段时间检查一次
Thread.sleep(10000); // 每10秒检查一次
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}
没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。
系列内容:
THE END
暂无评论内容