Redis系列之CacheCloud简介

本文介绍CacheCloud在数据同步场景下appId的合法性校验过程,探讨了当输入非法appId时出现的循环重试错误及解决方案。通过源码分析,引入额外依赖解决了异常捕获问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

CacheCloud,最早知道这个组件,是在《Redis开发与运维》这本书里面看到的。
GitHub,搜狐开源的一套Redis集群管理、可视化平台;
GitHub-README
GitHub-wiki
除了GitHub站点的文档,还有停更的官方GitPage

安装

问题

appId合法性校验

背景:在我们团队维护的一个数据产品中,有个数据同步功能,如支持MySQL数据同步到Redis。然后我们的Redis集群使用的是开源的CacheCloud,不同的研发团队或部门被分配有一个全局唯一的appId。此appId即代表数据同步的源头或者目标。大致如此。

需求:校验用户输入的appId是一个合法的CacheCloud appId,否则数据同步从何谈起?

import com.ppdai.cachecloud.builder.ClientBuilder;
import com.ppdai.cachecloud.redis.clients.jedis.JedisCluster;

@Slf4j
@ProviderName(name = "redis")
public class RedisDataProvider extends DataProvider {
	@Override
	public void check() throws Exception {
	    getConnection();
	}
	
	private JedisCluster getConnection() {
	    long appId = Long.parseLong(dataSource.get("appId"));
	    return ClientBuilder.redisCluster(appId)
	            .setJedisPoolConfig(getPoolConfig())
	            .setConnectionTimeout(2000)
	            .setSoTimeout(1000)
	            .build();
	}
}

maven依赖(经过我们公司二次开发修改groupId)为:

<dependency>
    <groupId>com.ppdai.cachecloud</groupId>
    <artifactId>cachecloud-jedis</artifactId>
    <version>2.2.0</version>
</dependency>
<dependency>
    <groupId>com.ppdai.cachecloud</groupId>
    <artifactId>cachecloud-open-client-redis</artifactId>
    <version>2.1.1</version>
</dependency>

上面的代码在appId合法时,没有任何问题。但是输入非法的appId时,报错一直停留在.build();这一行,且是无限次的循环重试:

2021-11-19 11:46:26.806 [ERROR][http-nio-8080-exec-2]:com.ppdai.cachecloud.builder.RedisClusterBuilder [load:198] remote build error, appId: 123122
com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input
 at [Source: (String)""; line: 1, column: 0]
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
	at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:4666)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4511)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3466)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3434)
	at com.ppdai.cachecloud.builder.RedisClusterBuilder.load(RedisClusterBuilder.java:196)
	at com.ppdai.cachecloud.builder.RedisClusterBuilder.build(RedisClusterBuilder.java:123)
	at com.xy.cloudiview.common.dataprovider.impl.RedisDataProvider.getConnection(RedisDataProvider.java:43)
	at com.xy.cloudiview.common.dataprovider.impl.RedisDataProvider.check(RedisDataProvider.java:33)
	at com.xy.cloudiview.common.services.DataProviderService.testConnection(DataProviderService.java:102)
	at com.xy.cloudiview.web.controller.datasource.DataSourceController.checkDatasource(DataSourceController.java:248)
2021-11-19 11:46:26.807 [ERROR][http-nio-8080-exec-2]:com.ppdai.cachecloud.builder.RedisClusterBuilder [build:130] [status code: 404] jedis node 信息找不到
com.ctrip.framework.apollo.exceptions.ApolloConfigStatusCodeException: [status code: 404] jedis node 信息找不到
	at com.ppdai.cachecloud.builder.RedisClusterBuilder.build(RedisClusterBuilder.java:124)
	at com.xy.cloudiview.common.dataprovider.impl.RedisDataProvider.getConnection(RedisDataProvider.java:43)
	at com.xy.cloudiview.common.dataprovider.impl.RedisDataProvider.check(RedisDataProvider.java:33)
	at com.xy.cloudiview.common.services.DataProviderService.testConnection(DataProviderService.java:102)
	at com.xy.cloudiview.web.controller.datasource.DataSourceController.checkDatasource(DataSourceController.java:248)

不知道是不是和建造者模式有关。即使加上try...catch{}语句块,也不能捕获异常。。

借助于IDEA强大的源码阅读功能,最终发现源码提供有一个工具类方法CachecloudJedisFactoryUtil.getHostAndPortForStandAlone

private JedisCluster getConnection() throws Exception {
    long appId = Long.parseLong(dataSource.get("appId"));
    try {
        CachecloudJedisFactoryUtil.getHostAndPortForStandAlone(dataSource.get("appId"));
    } catch (IllegalArgumentException e) {
        throw new Exception(e.getMessage());
    }
    return ClientBuilder.redisCluster(appId)
            .setJedisPoolConfig(getPoolConfig())
            .setConnectionTimeout(2000)
            .setSoTimeout(1000)
            .build();
}

需要加入一个依赖:

<dependency>
    <groupId>com.ppdai.cachecloud</groupId>
    <artifactId>cachecloud-spring-boot-apollo</artifactId>
    <version>2.1.1</version>
</dependency>

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

johnny233

晚饭能不能加鸡腿就靠你了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值