聊聊redis的HealthIndicator

て烟熏妆下的殇ゞ 提交于 2019-11-28 19:47:03

本文主要研究一下redis的HealthIndicator

RedisHealthIndicator

spring-boot-actuator-2.0.4.RELEASE-sources.jar!/org/springframework/boot/actuate/redis/RedisHealthIndicator.java

public class RedisHealthIndicator extends AbstractHealthIndicator {

	static final String VERSION = "version";

	static final String REDIS_VERSION = "redis_version";

	private final RedisConnectionFactory redisConnectionFactory;

	public RedisHealthIndicator(RedisConnectionFactory connectionFactory) {
		super("Redis health check failed");
		Assert.notNull(connectionFactory, "ConnectionFactory must not be null");
		this.redisConnectionFactory = connectionFactory;
	}

	@Override
	protected void doHealthCheck(Health.Builder builder) throws Exception {
		RedisConnection connection = RedisConnectionUtils
				.getConnection(this.redisConnectionFactory);
		try {
			if (connection instanceof RedisClusterConnection) {
				ClusterInfo clusterInfo = ((RedisClusterConnection) connection)
						.clusterGetClusterInfo();
				builder.up().withDetail("cluster_size", clusterInfo.getClusterSize())
						.withDetail("slots_up", clusterInfo.getSlotsOk())
						.withDetail("slots_fail", clusterInfo.getSlotsFail());
			}
			else {
				Properties info = connection.info();
				builder.up().withDetail(VERSION, info.getProperty(REDIS_VERSION));
			}
		}
		finally {
			RedisConnectionUtils.releaseConnection(connection,
					this.redisConnectionFactory);
		}
	}

}
  • 这里判断是否是cluster,如果是则调用clusterGetClusterInfo,否则调用info方法

RedisReactiveHealthIndicator

spring-boot-actuator-2.0.4.RELEASE-sources.jar!/org/springframework/boot/actuate/redis/RedisReactiveHealthIndicator.java

public class RedisReactiveHealthIndicator extends AbstractReactiveHealthIndicator {

	private final ReactiveRedisConnectionFactory connectionFactory;

	public RedisReactiveHealthIndicator(
			ReactiveRedisConnectionFactory connectionFactory) {
		this.connectionFactory = connectionFactory;
	}

	@Override
	protected Mono<Health> doHealthCheck(Health.Builder builder) {
		ReactiveRedisConnection connection = this.connectionFactory
				.getReactiveConnection();
		return connection.serverCommands().info().map((info) -> up(builder, info))
				.doFinally((signal) -> connection.close());
	}

	private Health up(Health.Builder builder, Properties info) {
		return builder.up().withDetail(RedisHealthIndicator.VERSION,
				info.getProperty(RedisHealthIndicator.REDIS_VERSION)).build();
	}

}
  • 采用lettuce的话,启用的是RedisReactiveHealthIndicator,这里调用info方法,不过这个方法返回的属性有点多,大约有83个

小结

redis的HealthIndicator分为RedisHealthIndicator以及RedisReactiveHealthIndicator。如果底层client采用的是lettuce,则使用的是reactive版本。其health检测方法,就是调用info命令。

doc

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!