在多线程环境中使用Jedis

15 篇文章 3 订阅

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
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值