关闭

在多线程环境中使用Jedis

标签: JedisJedis线程安全JedisPoolJedis多线程Jedis连接池
20038人阅读 评论(7) 收藏 举报
分类:

Jedis是一个Java语言的Redis客户端,它为Java语言连接与操作Redis提供了简单易用的接口。
Jedis不是线程安全的,故不应该在多线程环境中共用一个Jedis实例。但是,也应该避免直接创建多个Jedis实例,因为这种做法会导致创建过多的socket连接,性能不高。
要保证线程安全且获得较好的性能,可以使用JedisPool。JedisPool是一个连接池,既可以保证线程安全,又可以保证了较高的效率。
可以声明一个全局的JedisPool变量来保存JedisPool对象的引用,然后在其他地方使用。要知道,JedisPool是一个线程安全的连接池。

JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

使用JedisPool来获得一个Jedis实例的方法如下,

Jedis jedis = null;
try {
    jedis = pool.getResource();
    /// ... 执行相关的Redis操作
    jedis.set("foo", "bar");
    String foobar = jedis.get("foo");
    jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
    Set<String> sose = jedis.zrange("sose", 0, -1);
} finally {
    if (jedis != null) {
        jedis.close();
    }
}
/// ... 当关闭应用程序时:
pool.destroy();

上面的程序首先通过pool.getResource()获得一个Jedis实例,然后利用这个Jedis实例向Redis服务器发送相关的指令操作,最后调用Jedis类的close方法,将这个Jedis实例归还给JedisPool。
Jedis类的close方法如下,

public void close() {
    if (dataSource != null) {
        if (client.isBroken())
            this.dataSource.returnBrokenResource(this);
        else
            this.dataSource.returnResource(this);
    } else {
      client.close();
    }
}

可以看到,如果是从JedisPool取得的Jedis实例(Jedis的dataSource成员不为空,即指向 一个JedisPool),会进行相应的归还给JedisPool的操作,如果是单独生成的一个Jedis实例(Jedis的dataSource成员为空),则会直接断开与Redis服务器的连接。

参考资料
Jedis wiki

2
1
查看评论

JedisPool使用原理及源代码

JedisPool的使用 public String set(String key, String value) { Jedis jedis = null; boolean success = true; try { jedis = this.pool.getResource()...
  • luyee2010
  • luyee2010
  • 2013-12-26 12:37
  • 42240

redis的Java客户端jedis池的介绍及使用

redis的Java客户端jedis池的介绍及使用 转自:http://blog.csdn.net/unix21/article/details/51354823 需要commons-pool.jar、jedis-2.1.0.jar commons-pool comm...
  • zxp2624161989
  • zxp2624161989
  • 2016-12-20 21:35
  • 1406

分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析

一、Redis与spring的整合一般分为spring-data-redis整合和JedisPool整合,先看看两者的区别1)、引用的依赖不同:spring-data-redis使用的依赖如下: <dependency> <groupId>org.s...
  • javaloveiphone
  • javaloveiphone
  • 2016-08-29 17:37
  • 9694

jedispool使用自动归还jedis解决方案

在使用Jedispool 的时候遇到一个尴尬的问题。实例必须要手动归还。即jedis高版本使用jedis.close()归还。这样据说是灵活的表现。 但如果必须手动调close,那么万一项目组的成员手抖忘记掉了,这就无疑会出现很严重的情况,这无疑增加了系统的脆弱性。由于我们系统是用grpc做通信机制...
  • dabaoge_
  • dabaoge_
  • 2017-01-10 21:35
  • 7263

通过JedisPool资源池管理jedis连接

要应用JedisPool资源池管理jedis,需要引入两个包,(1)jedis jar包或redis jar包 (2)阿帕奇下的commons-pool jar包,好像用到资源池的都需要这个下面是一点点小代码。需要说明的是,释放jedis资源的方法已经deprecated了,不知道是不是这个原因,...
  • xuanfengling
  • xuanfengling
  • 2016-04-06 11:34
  • 1887

jedisPool

Jedis的框架概览 Jedis使用了apache commons-pool库,用来实现连接redis客户端的池子。   commons-pool库中有三个类:GenericObjectPool、PoolableObjectFactory、Config,其中: PoolableOb...
  • zoumin123456
  • zoumin123456
  • 2015-11-16 11:20
  • 986

Jedis源码解析(一)-------Jedis与JedisPool

1 主要类的结构1.1 Jedis类的结构 1.2 Client类的结构 2 Send Command[*号][消息元素个数]\r\n ( 消息元素个数 = 参数个数 + 1个命令) [号][命令字节个数]\r\n[命令内容]\r\n[号][命令字节个数]\r\n ...
  • ouyang111222
  • ouyang111222
  • 2016-03-14 13:19
  • 2525

java Jedis连接池的使用

所需jar:jedis-2.1.0.jar和commons-pool-1.5.4.jar Jedis操作步骤如下: 1->获取Jedis实例需要从JedisPool中获取; 2->用完Jedis实例需要返还给JedisPool; 3->如果Jedis在使用过程中出错,则也需...
  • songylwq
  • songylwq
  • 2014-05-16 20:52
  • 66833

【Redis】spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析

一、Redis与spring的整合一般分为spring-data-redis整合和JedisPool整合,先看看两者的区别 1)、引用的依赖不同: spring-data-redis使用的依赖如下: dependency> groupId>org...
  • moshenglv
  • moshenglv
  • 2017-05-23 10:22
  • 2313

SSM(Spring + Spring MVC +Mybatis)的Redis缓存,JedisPool配置

SSM(Spring + Spring MVC +Mybatis)的Redis缓存,JedisPool配置
  • weixin_36751895
  • weixin_36751895
  • 2017-04-20 08:57
  • 4436
    个人资料
    • 访问:705079次
    • 积分:6450
    • 等级:
    • 排名:第4470名
    • 原创:164篇
    • 转载:8篇
    • 译文:1篇
    • 评论:121条
    博客专栏
    文章分类
    最新评论