Jedis是java语言实现的Redis客户端驱动。Data Redis的封装并不太必要,因为Jedis已足够简单,没有像Spring Data MongoDB对MongoDB java driver的封装那样大幅简化代码,顶多就是加强了一点点点pipeline和transaction状态下的coding,禁止了一些此状态下不能用的命令。而所谓屏蔽各种底层driver的差异并不太吸引人。
client端连接池实现
Jedis基于Apache Commons Pool做的连接池,默认MaxActive最大连接数只有8,必须重新设置。而且MaxIdle也要相应增大,否则所有新建的连接用完即弃,然后会不停的重新连接。
另外Jedis设定了每30秒对所有连接执行一次ping,以发现失效的连接,这样每30秒会有一个拿不到连接的高峰。但效果如何需要独立分析。比如系统高峰之后可能有一长段时间很闲,而且Redis Server那边做了Timeout控制会把连接断掉,这时候做idle checking是有意义的,但30秒一次也太过频繁了。否则关掉它更好。
Redis默认最大连接数是10000(一万);Redis默认不对Client做Timeout处理,可以用timeout 项配置,但即使配了也不会非常精确。
JedisPool使用示例
Jedis实例是非线程安全的,当需要创建多个Jedis实例时要使用JedisPool类,当使用完Jedis对象时要放回JedisPool。
关闭连接
Jedis的blocking pop函数,应用执行ExecutorService.shutdownNow()中断线程时并不能把它中断。
两个解决方法:
- 不要用不限时的blocking popup,传多一个超时时间参数,如5秒。
- 找地方将调用blocking popup的Jedis保存起来,shutdown时主动调用它的close。
参考链接
Jedis-wiki