Codis学习笔记--Java连接codis

连接到Codis Proxy跟连接到原生的Redis Server是一样的,只是Codis Proxy不支持部分Redis操作命令。连接Codis Proxy的Java客户端有Jedis、Jodis等,下面简单介绍一下Jedis和Jodis的用法

一、Jedis用法

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用法

Jodis是一个基于Jedis和Curator(zookeeper的Java客户端)的Java客户端。

特性:

1.可实时检测codis-proxy的在线和离线状态,通过监控zookeeper上的proxy注册信息实时获取当前可用的proxy列表,保证可用性。

2.采用轮询策略实现codis-proxy的负载均衡。

使用Jodis需要在codis-proxy.toml配置中配置jodis的注册信息:

Codis学习笔记--Java连接codis_第1张图片

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时遇到的坑:

Codis学习笔记--Java连接codis_第2张图片

报错信息: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

你可能感兴趣的:(Codis)