连接到Codis Proxy跟连接到原生的Redis Server是一样的,只是Codis Proxy不支持部分Redis操作命令。连接Codis Proxy的Java客户端有Jedis、Jodis等,下面简单介绍一下Jedis和Jodis的用法
Jedis是一个非常小而全的Redis Java客户端,也是官方推荐的客户端。
maven依赖:
redis.clients
jedis
3.0.1
jar
compile
1.不使用连接池
public class JedisTest {
public static void main(String[] args) {
// ip端口为codis-proxy的ip端口
Jedis jedis = new Jedis("120.xx.xxx.xx", 19000);
jedis.set("foo", "bar");
String value = jedis.get("foo");
System.out.println(value);
}
}
2.使用连接池
public class JedisPoolTest {
public static void main(String[] args) {
// 连接池配置
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(50);
config.setMinIdle(1);
config.setMaxWaitMillis(30000);
// 创建连接池,ip端口为codis-proxy的ip端口
JedisPool jedisPool = new JedisPool(config, "120.xx.xxx.xx", 19000);
// 从连接池中获取连接
try (Jedis jedis = jedisPool.getResource()) {
jedis.set("foo1", "bar1");
String value = jedis.get("foo1");
System.out.println(value);
}
}
}
Jodis是一个基于Jedis和Curator(zookeeper的Java客户端)的Java客户端。
特性:
1.可实时检测codis-proxy的在线和离线状态,通过监控zookeeper上的proxy注册信息实时获取当前可用的proxy列表,保证可用性。
2.采用轮询策略实现codis-proxy的负载均衡。
使用Jodis需要在codis-proxy.toml配置中配置jodis的注册信息:
codis-proxy在启动时,会将proxy节点信息注册到指定的zookeeper的jodis节点下
maven依赖:
io.codis.jodis
jodis
0.5.1
public class JodisTest {
private static final String zkAddr = "120.79.200.63:2181";
private static final int zkSessionTimeoutMs = 30000;
private static final String zkProxyDir = "/jodis/codis-demo";
public static void main(String[] args) {
BasicConfigurator.configure();
JedisResourcePool jedisPool = RoundRobinJedisPool.create()
.curatorClient(zkAddr, zkSessionTimeoutMs).zkProxyDir(zkProxyDir).build();
try (Jedis jedis = jedisPool.getResource()) {
jedis.set("foo", "bar");
String value = jedis.get("foo");
System.out.println(value);
}
}
}
使用Jodis时遇到的坑:
报错信息:java.net.UnknownHostException:iZwz977ogd6jecq7rowvtsZ,大概就是解析主机iZwz977ogd6jecq7rowvtsZ失败
我就很好奇,我codis-proxy.toml配置中配置的proxy-addr地址明明是0.0.0.0:19000,为什么注册到zk中的proxy-addr变成iZwz977ogd6jecq7rowvtsZ:19000了呢?iZwz977ogd6jecq7rowvtsZ这个字符串又是什么鬼呢?
查了很久,发现iZwz977ogd6jecq7rowvtsZ竟是我的主机名,0.0.0.0被转换成了hostname。
原来,proxy bind地址的时候,如果使用的是 0.0.0.0 的时候,proxy需要让codis-config能够访问的到,所以proxy在向zk注册(或者向dashboard注册)的时候,会主动将 0.0.0.0 换成 hostname,这样 dashboard 以及 jodis才能知道proxy的真实地址。
解决办法:proxy_addr不要使用0.0.0.0,使用具体的ip