本文介绍基于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. GenyMotion 配合 Android Studio 的安装

    众所周知,Android Studio 自带的模拟器对内存和CPU消耗都很大却并没有很好的效果,简直是谷歌为了卖手机设计的.而Geny Motion 对机能的要求大大降低,又不会像自带模拟器那么卡.G ...

  2. lambda函数常见用法

    # lambda 参数:返回值/表达式 # print((lambda :100)()) # f = lambda a,b : a + b # print(f(10, 20)) # f = lambd ...

  3. css绝对底部的实现方法

    最近发现公司做的好多管理系统也存在这样的问题,当页面不够长的时候,页尾也跟着跑到了页面中部,这样确实感觉视觉体验不太好,没有研究之前还真不知道还能用css实现,主要利用min-height;paddi ...

  4. SpringMVC中日期格式的转换

    解决日期提交转换异常的问题 由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑定.前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestM ...

  5. java线程间通信之通过管道进行通信

    管道流PipeStream是一种特殊的流,用于在不同线程间直接传送数据,而不需要借助临时文件之类的东西. jdk中提供了四个类来使线程间可以通信: 1)PipedInputStream和PipedOu ...

  6. subline常用快捷键

    一次创建5个class为main的div  :    div.main*5 +TAB 快速生成HTML结构: ! + TAB 使盒子内的文本水平垂直方向对齐: height:value; line-h ...

  7. JS 实现无缝滚动动画原理(初学者入)

    这段时间在教培训班的学生使用原生javascript实现无缝滚动的动画案例,做了这个原理演示的动画,分享给自学JS的朋友!博主希望对你们有帮助! 在讲解之前先看一下demo: demo:https:/ ...

  8. 十七、Hadoop学记笔记————Hbase入门

    简而言之,Hbase就是一个建立在Hdfs文件系统上的数据库(mysql,orecle等),不同的是Hbase是针对列的数据库 Hbase和普通的关系型数据库区别如下: Hbase有一些基本的术语,主 ...

  9. 深入JVM分析spring-boot应用hibernate-validator

    问题 可重现的Demo代码:demo.zip 最近排查一个spring boot应用抛出hibernate.validator NoClassDefFoundError的问题,异常信息如下: Caus ...

  10. 微信公众号开发 包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证 2017.12.2

    https://www.cnblogs.com/klmei/p/7060879.html  基础配置很全面