Java客户端连接Redis

/ Redis / 没有评论 / 443浏览

Reids是通过单线程来处理多个客户端访问的,并且客户端与服务端的通信协议是在TCP协议之上创建的。由于Redis的使用比较广泛,所以基本上主流的编程语言都提供了相应的客户端来支持使用Redis。在这一篇中本人将介绍Java客户端工具。由于Java客户端工具是第三方开发的,种类比较多,所以本篇将介绍redis-clients客户端工具。因为在使用Java客户端涉及到第三方的jar包,所以本篇将忽略项目其它的相关配置,将重点介绍Java客户端工具的API使用,有关配置的内容,会在文章的最后,上传项目源码,可以在源码中查看。下面我们将重点介绍Redis中Java客户端的使用。


下面我们使用客户端来演示Redis中的set和get命令。

package com.jilinwula.redis;

import redis.clients.jedis.Jedis;

public class RedisJava {

  public static void main(String[] args) {
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    jedis.set("redis_java", "hello world");
    System.out.println(jedis.get("redis_java"));
  }

}

hello world

Jedis类是Java用来和Redis进行通信的工具类。该工具类中的构造方法主要有4个参数,下面我们详细介绍一下:


下面我们介绍其它数据类型的API使用。

package com.jilinwula.redis;

import redis.clients.jedis.Jedis;

public class RedisJava {

  public static void main(String[] args) {
    Jedis jedis = new Jedis("127.0.0.1", 6379);

    jedis.set("redis_string", "redis_string");
    System.out.println(String.format("String类型:%s",jedis.get("redis_string")));

    jedis.hset("redis_hash", "redis_hash","redis_hash");
    System.out.println(String.format("Hash类型:%s",jedis.hgetAll("redis_hash")));

    jedis.rpush("redis_list","redis_list");
    System.out.println(String.format("List类型:%s",jedis.lrange("redis_list", 0, -1)));

    jedis.sadd("redis_set", "redis_set");
    System.out.println(String.format("Set类型:%s",jedis.smembers("redis_set")));

    jedis.zadd("redis_zset",100,"redis_zset");
    System.out.println(String.format("Zset类型:%s",jedis.zrangeByScore("redis_zset", 0 , 200)));
  }

}

String类型:redis_string
Hash类型:{redis_hash=redis_hash}
List类型:[redis_list, redis_list, redis_list, redis_list]
Set类型:[redis_set]
Zset类型:[redis_zset]

上面的方式是采用直连的方式操作Redis的,也就是Jedis每次都会直接创建TCP连接的,而对于操作比较频繁的业务中,上述的方式显示不是最合理的。所以在生产环境中,我们通常不会使用Jedis对象直连,而是使用为我们连接池的方式来操作Redis。连接池中会有很多个Jedis对象,当需要连接Redis时,只需要在连接池中获取Jedis对象即可,当用完后,在将Jedis对象归还给连接池。下面我们了解一下采用直连和连接池之间的区别。

优点缺点
直连简单方便,适用少量长期连接场景
连接池不用每次连接都创建Jedis对象

下面我们看一下怎么用连接池操作Redis。

package com.jilinwula.redis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class RedisJava {

  public static void main(String[] args) {
    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);

    Jedis jedis = null;
    try {
      jedis = jedisPool.getResource();
      jedis.set("java", "hello world");
      System.out.println(jedis.get("java"));
    } catch (Exception e) {
      System.out.println(e);
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
  }

}

hello world

下面我们详细介绍一下GenericObjectPoolConfig中的参数。

参数名作用默认值
maxActive连接池中最大连接数8
maxIdle连接池中最大空闲的连接数8
minIdle连接池中最少空闲的连接数0
maxWaitMillis当连接池资源耗尽时,客户端最大等待时间单位是毫秒-1:表示永远不超时,一直等待
jmxEnabled是否开启jmx监控,如果开启了,并且jmxEnabled设置为true,则可以查看连接池的相关统计信息,可以为做监控统计true
minEvictableIdleTimeMIllis连接的最小空闲时间,达到此值后空闲连接将被移除30分种
numTestsPerEvictionRun空闲连接检测时,每次的采集数3
testOnBorrow向连接池取连接时是否做连接有效性检测,无效连接会被移除false
testOnReturn向连接池还连接时是否做连接有效性检测,无效连接会被移除false
testWhileIdle向连接池取连接时是否做连接空闲检测,空闲超时的连接会被移除false
timeBetweenEvictionRunsMillis空闲连接的检测周期(单位为毫秒)-1:表示不做检测
blockWhenExhausted当连接池用尽后,调用者是否要等待,该参数和maxWaitMillis对应,只有当该参数为true时,maxWaitMillis才会生效true

下面我们了解一下Pipeline的使用。由于Redis没有提供批量删除的功能,所以下面我们将通过Pipeline来演示批量删除的使用。

package com.jilinwula.redis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Pipeline;

public class RedisJava {

  public static void main(String[] args) {
    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);

    String[] keys = new String[]{"java", "python"};
    Jedis jedis = null;
    try {
      jedis = jedisPool.getResource();
      Pipeline pipeline = jedis.pipelined();
      for (String key : keys) {
        pipeline.del(key);
      }
      pipeline.sync();
    } catch (Exception e) {
      System.out.println(e);
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
  }

}

上述代码中pipeline.del(key)命令并不会真正的执行,而在执行pipeline.sync()代码时,才会执行。


上述内容就是有关Redis中Java客户端的知识。