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

Jedis简介

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

获取Jedis

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

     <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对象给连接池。具体代码如下:

创建Jedis连接池并初始化:

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对象,进而进行操作:

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预先生成,降低开销使用
  • 连接池的形式保护和控制资源的使用
  • 相对于直连,使用相对麻烦,尤其在资源的管理上需要很多参数来保证,一旦规划不合理也会出现问题

Redis客户端——Jedis的使用的更多相关文章

  1. redis 学习(8)-- redis 客户端 -- Jedis

    redis 客户端 -- Jedis 1. Jedis 直连 本质是 TCP 连接. 执行流程 创建Jedis对象 通过Jedis执行命令 返回Jedis执行结果 关闭Jedis连接 demo 要使用 ...

  2. spring 集成redis客户端jedis(java)

    spring集成jedis简单实例   jedis是redis的java客户端,spring将redis连接池作为一个bean配置. “redis.clients.jedis.JedisPool”,这 ...

  3. spring 5.x 系列第8篇 —— 整合Redis客户端 Jedis和Redisson (代码配置方式)

    文章目录 一.说明 1.1 Redis 客户端说明 1.2 Redis可视化软件 1.3 项目结构说明 1.3 依赖说明 二.spring 整合 jedis 2.1 新建基本配置文件和其映射类 2.2 ...

  4. spring 5.x 系列第7篇 —— 整合Redis客户端 Jedis和Redisson (xml配置方式)

    文章目录 一.说明 1.1 Redis 客户端说明 1.2 Redis可视化软件 1.3 项目结构说明 1.3 依赖说明 二.spring 整合 jedis 2.1 新建基本配置文件 2.2 单机配置 ...

  5. Java操作redis客户端Jedis使用

    1.1   jedis介绍 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Java的客户端,有 ...

  6. Redis 客户端 Jedis、lettuce 和 Redisson 对比

    Redis 支持多种语言的客户端,下面列举了部分 Redis 支持的客户端语言,大家可以通过官网查看 Redis 支持的客户端详情. C语言 C++ C# Java Python Node.js PH ...

  7. 深入剖析Redis客户端Jedis的特性和原理

    一.开篇 Redis作为目前通用的缓存选型,因其高性能而倍受欢迎.Redis的2.x版本仅支持单机模式,从3.0版本开始引入集群模式. Redis的Java生态的客户端当中包含Jedis.Rediss ...

  8. redis客户端jedis连接和spring结合

    摘自传智博客课程 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="htt ...

  9. Java操作redis客户端Jedis连接集群(Cluster)

    创建JedisCluster类连接redis集群. @Test public void testJedisCluster() throws Exception { //创建一连接,JedisClust ...

随机推荐

  1. Qt5.7 实现Https 认证全过程解析(亲自动手版)

    #### NetworkRequestManager.h #include <QSsl>#include <QSslKey>#include <QSslSocket> ...

  2. ArcCore重构-头文件引用问题的初步解决

    基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5   基本问题 1. 头文件引用混乱,所有头文件通过从搜索路径(-I)中引用,存在名称污染问题,需加入路径信息:   ...

  3. python笔试题(1)

            为了充实自己,小编决定上传自己见到的笔试题和面试题.可能要写好长时间,一时半会写不了多少,只能说遇到多少写多少吧,但是只要小编有时间,会持续上传(但是答案却不能保证,所以有看到错误的及 ...

  4. python2.7 的中文编码处理,解决UnicodeEncodeError: 'ascii' codec can't encode character 问题

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...

  5. .NET开发微信小程序-微信支付

    前台MD5加密代码 /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algor ...

  6. android dp深度解析(转)

    我转载地方的连接:http://zhangkun716717-126-com.iteye.com/blog/1772696  当笔记记录一下 dip: device independent pixel ...

  7. xcode6.1 设置中文输入

    XCode6.1中设置中文输入方法:Product->scheme->Edit Scheme->Options->Application Region->中国 ios 模 ...

  8. C#实现联通短信Sgip协议程序源码

    此程序为中国联通Sgip协议程序接口,适合在中国联通申请了短信发送端口的公司使用. 短信群发已经成为现在软件系统.网络营销等必不可少的应用工具.可应用在短信验证.信息群发.游戏虚拟商品购买.事件提醒. ...

  9. elasticsearch x-pack

    elasticsearch-plugin.bat install x-pack D:\elasticsearch-5.5.3\bin>elasticsearch-plugin.bat insta ...

  10. 如何开始使用 Java 机器学习

    开始Java机器学习的最好工具是什么? 这个问题已经有一段时间了,但最近这些日子几乎每个人都在谈论人工智能和机器学习.这已经不再是一个保留给科学家和研究者的秘密,而是几乎实现于每一项新兴技术中. 在下 ...