Redis客户端——Jedis的使用

本文介绍基于Java语言的Redis客户端——Jedis的使用,包括Jedis简介、获取Jedis、Jedis直连、Jedis链接池以及两者的对比的选择。git

Jedis简介

Jedis 是 Redis 官方首选的基于Java语言的客户端开发包。Jedis功能强大,提供了完整Redis命令,与 Redis 2.8.x, 3.x.x及以上版本彻底兼容。并且使用简单方便,绝对是Java语言的首选客户端。github

获取Jedis

获取Jedis能够在 http://github.com/xetorthio/jedis/releases下载最新的版本;或者引入Maven依赖:redis

     <dependency>
         <groupId>redis.clients</groupId>
         <artifactId>jedis</artifactId>
         <version>3.0.1</version>
         <type>jar</type>
         <scope>compile</scope>
     </dependency>

Jedis直连

Jedis直连须要生成Jedis对象,这个对象负责和指定Redis节点进行通讯。
Jedis jedis = new Jedis("127.0.0.1",6379);

而后就能够进行基本操做:数据库

  • string
jedis.set("hello","world");
jedis.get("hello");
jedis.incr("counter");
  • hash
jedis.hset("myhash","f1","v1");
jedis.hset("myhash","f2","v2");
jedis.hgetAll("myhash");
  • list
jedis.rpush("mylist","1");
jedis.rpush("mylist","2");
jedis.rpush("mylist","3");
jedis.lrange("mylist",0,-1);
  • set
jedis.sadd("myset","a");
jedis.sadd("myset","b");
jedis.sadd("myset","a");
jedis.smember("myset");
  • zset
jedis.zadd("myzset",99,"alan");
jedis.zadd("myzset",88,"paul");
jedis.zadd("myzset",77,"077");
jedis.zrangeWithScores("myzset",0,-1);

Jedis链接池

什么是链接池?举个类比,线程池是把线程放到便于统一管理的容器里面,那么链接池就是把链接放到一个容器里面,方便链接的管理和使用,达到节省系统资源开销和时间的效果。安全

若是没有链接池,在实际应用开发中,每一次Jedis请求都必须经历生成Jedis对象、Jedis执行命令、Jedis返回执行结果和关闭Jedis链接等步骤,而新建Jedis对象,而后新建链接并打开数据库是一件既消耗资源又费时的工做,若是频繁发生这种数据库操做,系统的性能必然会急剧降低,甚至会致使系统崩溃。若是运用池化技术,将链接做为对象存储在一个容器中(链接池),一旦链接池创建后,这些链接是共享的,极大地节省系统资源和时间,这就是Jedis链接池。若是以前已经了解过线程池,我想这儿看着会至关轻松写意。性能

Jedis链接池使用主要有如下几个步骤:建立链接池池、向链接池借Jedis对象、Jedis执行命令、返回执行结果、归还Jedis对象给链接池。具体代码以下:spa

建立Jedis链接池并初始化:.net

GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig,"127.0.0.1",6739);

能够看到,JedisPool大部分配置都在GenericObjectPoolConfig中完成的,GenericObjectPoolConfig参数说明以下表:线程

参数
参数说明
maxTotal
最大链接数,默认8个。
maxIdle
最大空闲链接数, 默认8个。
minIdle
最小空闲链接数,默认0个。
maxWaitMillis
当borrow(引入)一个jedis实例时,最大的等待时间,若是超过等待时间,则直接抛出JedisConnectionException。
testOnBorrow
在borrow一个jedis实例时,是否提早检查链接可用性(ping())操做;若是为true,则获得的jedis实例均是可用的。默认为false。
blockWhenExhausted
链接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true。
testOnReturn
在return一个jedis实例时,是否检查链接可用性(ping()),默认为false。
testWhileIdle
若是为true,表示有一个idle object evitor线程对idle object进行扫描,若是validate失败,此object会被从pool中drop掉。
这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义。
minEvictableIdleTimeMillis
表示一个对象至少停留在idle状态的最短期,而后才能被idle object evitor扫描并驱逐。这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义。
JedisPoolConfig中默认设置为60000。
timeBetweenEvictionRunsMillis
 
表示idle object evitor两次扫描之间要sleep的毫秒数,默认设置为30000。

建立和初始化Jedis链接池之后,能够从Jedis链接池中获取Jedis对象,进而进行操做:code

Jedis jedis = null;
try{
    //1.从链接池获取jedis对象
    jedis = jedisPool.getResource();
    //2.执行操做
    jedis.set("hello","world");
}catch(Exception e){
    e.printStackTrace();
}finally{
    if(jedis != null){
        //归还链接池
        jedis.close();
    }
}

如何选择

Jedis直连和使用Jedis链接池各有所长,能够根据生产环境的须要因地制宜。

若是是少许的链接,而且每次链接时间较长,适合使用Jedis直连的方式。

若是是较为频繁的链接则使用Jedis链接池。

  优势 缺点
直连
  • 简单方便
  • 用于少许长期链接的场景
  • 每次新建/关闭TCP开销较大
  • 资源没法控制,存在链接泄漏的可能
  • Jedis对象线程不安全
链接池
  • Jedis预先生成,下降开销使用
  • 链接池的形式保护和控制资源的使用
  • 相对于直连,使用相对麻烦,尤为在资源的管理上须要不少参数来保证,一旦规划不合理也会出现问题
相关文章
相关标签/搜索