在多线程环境中使用Jedis
2015-07-20 09:49
225 查看
Jedis是一个Java语言的Redis客户端,它为Java语言连接与操作Redis提供了简单易用的接口。
Jedis不是线程安全的,故不应该在多线程环境中共用一个Jedis实例。但是,也应该避免直接创建多个Jedis实例,因为这种做法会导致创建过多的socket连接,性能不高。
要保证线程安全且获得较好的性能,可以使用JedisPool。JedisPool是一个连接池,既可以保证线程安全,又可以保证了较高的效率。
可以声明一个全局的JedisPool变量来保存JedisPool对象的引用,然后在其他地方使用。要知道,JedisPool是一个线程安全的连接池。
使用JedisPool来获得一个Jedis实例的方法如下,
上面的程序首先通过
Jedis类的
可以看到,如果是从JedisPool取得的Jedis实例(Jedis的dataSource成员不为空,即指向 一个JedisPool),会进行相应的归还给JedisPool的操作,如果是单独生成的一个Jedis实例(Jedis的dataSource成员为空),则会直接断开与Redis服务器的连接。
参考资料
Jedis wiki
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
相关文章推荐
- log4net日志的简单配置
- NandFlash操作详解(三)
- 用户用浏览器访问一个网站的时候具体的过程与步骤
- 简单的电话拨打
- PAT (Basic Level) Practise (中文)1018. 锤子剪刀布 (20)
- java之XML解析(Dom及Sax)
- Android 内存溢出问题
- Matlab中transpose函数的使用
- UVa 740 - Baudot Data Communication Code
- U盘杀毒专家3.21 官方最新版已破解
- AVFoundation视频播放、存储原理分析与使用
- Xcode7 真机调试步骤以及遇到的问题解决办法
- thinkphp复合WHERE查询的写法
- hdu 1071 The area
- Oracle ltrim() rtrim() 函数详细用法
- FLAG_ACTIVITY_BROUGHT_TO_FRONT与FLAG_ACTIVITY_REORDER_TO_FRONT区别
- UIApplication深入研究
- 苹果审核状态
- Python命令行参数
- php生成随机颜色代码