更新时间:2022-08-06 GMT+08:00

Jedis

介绍使用同一VPC内弹性云服务器ECS上的Jedis连接Redis实例的方法。更多的客户端的使用方法,请参考https://redis.io/clients

  • 如果创建Redis实例时设置了密码,使用Jedis客户端连接Redis时,需要配置密码进行连接,建议不要将明文密码硬编码在代码中。
  • 如果使用JedisCluster连接Redis4.0/5.0 Cluster集群,集群内部拓扑结构会自动刷新,客户端需要自己处理重连问题。

前提条件

  • 已成功申请Redis实例,且状态为“运行中”。
  • 已创建弹性云服务器,创建弹性云服务器的方法,请参见《弹性云服务器用户指南》。
  • 如果弹性云服务器为Linux系统,该弹性云服务器必须已经安装java编译环境

操作步骤

  1. 查看并获取待连接Redis实例的IP地址/域名和端口。

    具体步骤请参见查看实例信息

  2. 登录弹性云服务器。
  3. 首先使用maven在pom.xml添加如下依赖。

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>4.1.1</version>
    </dependency>

  4. 使用Redis Java (Jedis)客户端连接Redis实例。

    获取Redis Java (Jedis)客户端源码,具体方法可参考获取Jedis源码。Jedis客户端访问DCS Redis服务,有以下两种方法:
    • Jedis单连接
    • Jedis连接池连接

    具体示例如下:

    1. jedis单连方式连接Redis单机/主备/Proxy集群示例。
      // 密码模式创建连接
       String host = "192.168.0.150"; 
       int port = 6379; 
       String pwd = "passwd"; 
        
       Jedis client = new Jedis(host, port); 
       client.auth(pwd);
       client.connect(); 
      // 执行set指令
       String result = client.set("key-string", "Hello, Redis!"); 
       System.out.println( String.format("set指令执行结果:%s", result) );
       // 执行get指令
       String value = client.get("key-string"); 
       System.out.println( String.format("get指令执行结果:%s", value) );
      
      // 免密模式创建连接
       String host = "192.168.0.150"; 
       int port = 6379; 
        
       Jedis client = new Jedis(host, port); 
       client.connect(); 
      // 执行set指令
       String result = client.set("key-string", "Hello, Redis!"); 
       System.out.println( String.format("set指令执行结果:%s", result) ); 
      // 执行get指令
       String value = client.get("key-string"); 
       System.out.println( String.format("get指令执行结果:%s", value) );

      其中,host为Redis实例的IP地址/域名,port为Redis实例的端口。IP地址/域名和端口获取见1,请按实际情况修改后执行。pwd为创建Redis实例时自定义的密码,请按实际情况修改后执行。

    2. jedis连接池连接Redis单机/主备/Proxy集群示例。
      // 密码模式生成连接池配置信息
       String ip = "192.168.0.150"; 
       int port = 6379; 
       String pwd = "passwd"; 
       GenericObjectPoolConfig config = new GenericObjectPoolConfig(); 
       config.setTestOnBorrow(false); 
       config.setTestOnReturn(false); 
       config.testWhileIdle(true);
       config.setMaxTotal(100); 
       config.setMaxIdle(100); 
       config.setMaxWaitMillis(2000); 
       JedisPool pool = new JedisPool(config, ip, port, 100000, pwd);// 在应用初始化的时候生成连接池
       // 在业务操作时,从连接池获取连接
       Jedis client = pool.getResource(); 
       try { 
           // 执行指令
           String result = client.set("key-string", "Hello, Redis!"); 
           System.out.println( String.format("set指令执行结果:%s", result) ); 
           String value = client.get("key-string"); 
           System.out.println( String.format("get指令执行结果:%s", value) ); 
       } catch (Exception e) { 
           // TODO: handle exception
       } finally { 
           // 业务操作完成,将连接返回给连接池
           if (null != client) { 
               pool.returnResource(client); 
           } 
       } // end of try block
       // 应用关闭时,释放连接池资源
       pool.destroy();
      
      // 免密模式生成连接池配置信息
       String ip = "192.168.0.150"; 
       int port = 6379; 
       GenericObjectPoolConfig config = new GenericObjectPoolConfig(); 
       config.setTestOnBorrow(false); 
       config.setTestOnReturn(false); 
       config.testWhileIdle(true);
       config.setMaxTotal(100); 
       config.setMaxIdle(100); 
       config.setMaxWaitMillis(2000); 
       JedisPool pool = new JedisPool(config, ip, port, 100000);// 在应用初始化的时候生成连接池
       // 在业务操作时,从连接池获取连接
       Jedis client = pool.getResource(); 
       try { 
           // 执行指令
           String result = client.set("key-string", "Hello, Redis!"); 
           System.out.println( String.format("set指令执行结果:%s", result) ); 
           String value = client.get("key-string"); 
           System.out.println( String.format("get指令执行结果:%s", value) ); 
       } catch (Exception e) { 
           // TODO: handle exception
       } finally { 
           // 业务操作完成,将连接返回给连接池
           if (null != client) { 
               pool.returnResource(client); 
           } 
       } // end of try block
       // 应用关闭时,释放连接池资源
       pool.destroy();

      其中,ip为Redis实例的IP地址/域名,port为Redis实例的端口。IP地址/域名和端口获取见1,请按实际情况修改后执行。pwd为创建Redis实例时自定义的密码,请按实际情况修改后执行。

      连接池testOnBorrow参数开启后支持自动重连,业务从连接池获取redis连接时连接池会检测连接,检测到正常的连接后再返回给业务,会有性能损耗,在性能要求高的使用场景建议不开启该参数,由上层应用自行处理异常和重试。

    3. 单连接方式连接Redis Cluster集群代码示例。
      • 加密访问的实例:
        // 以下是加密访问
        int port = 6379;
        String host = "192.168.144.37";
        // 创建jediscluster
        Set<HostAndPort> nodes = new HashSet<HostAndPort>();
        nodes.add(new HostAndPort(host, port));
        JedisCluster cluster = new JedisCluster(nodes, 5000, 3000, 10, "password", new JedisPoolConfig());
        cluster.set("key", "value");
        System.out.println("Connected to RedisCluster:" + cluster.get("key"));
        cluster.close();
      • 免密访问的实例:
        int port = 6379;
        String host = "192.168.144.37";
        // 创建jediscluster
        Set<HostAndPort> nodes = new HashSet<HostAndPort>();
        nodes.add(new HostAndPort(host, port));
        JedisCluster cluster = new JedisCluster(nodes);
        cluster.set("key", "value");
        System.out.println("Connected to RedisCluster:" + cluster.get("key"));
        cluster.close();

      其中,host为Redis实例的IP地址/域名,port为Redis实例的端口。IP地址/域名和端口获取见1,请按实际情况修改后执行。password为创建Redis实例时自定义的密码,请按实际情况修改后执行。

  5. 参考Redis Java (Jedis) 客户端源码中的readme文件编译代码并运行Redis Java (Jedis) 客户端连接Redis实例。