本文介绍基于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 = 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参数说明如下表:
创建和初始化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连接池。