API:http://tool.oschina.net/uploads/apidocs/
1.获取Jedis
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.2</version>
</dependency>
2.Jedis的基本使用方法
# 1. 生成一个Jedis对象,这个对象负责和指定Redis实例进行通信 J
edis jedis = new Jedis("127.0.0.1", 6379);
# 2. jedis执行set操作
jedis.set("hello", "world");
# 3. jedis执行get操作, value="world"
String value = jedis.get("hello");
可以看到初始化Jedis需要两个参数:Redis实例的IP和端口,除了这两个参数外,还有一个包含了四个参数的构造函数是比较常用的:
Jedis(final String host, final int port, final int connectionTimeout, final int soTimeout)
参数说明:
·host:Redis实例的所在机器的IP。
·port:Redis实例的端口。
·connectionTimeout:客户端连接超时。
·soTimeout:客户端读写超时。
String setResult = jedis.set("hello", "world");
String getResult = jedis.get("hello");
System.out.println(setResult);
System.out.println(getResult);
输出结果为:
OK
world
在实际项目中比较推荐使用try catch finally的形式来进行代码的书写: 一方面可以在Jedis出现异常的时候(本身是网络操作),将异常进行捕获 或者抛出;另一个方面无论执行成功或者失败,将Jedis连接关闭掉
![](https://img.haomeiwen.com/i17993869/5712f0a467780c98.png)
3.Jedis连接池的使用方法
![](https://img.haomeiwen.com/i17993869/cfb4b312744ce0a2.png)
1)Jedis连接池(通常JedisPool是单例的):
// common-pool连接池配置,这里使用默认配置,后面小节会介绍具体配置说明
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
// 初始化Jedis连接池
JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
这里GenericObjectPoolConfig使用的是默认配置,实际它提供有很多参数,例如池子中最大连接数、最大空闲连接数、最小空闲连接数、连接活性检测,等等,例如下面代码:
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
// 设置最大连接数为默认值的5倍
poolConfig.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL * 5);
// 设置最大空闲连接数为默认值的3倍
poolConfig.setMaxIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE * 3);
// 设置最小空闲连接数为默认值的2倍
poolConfig.setMinIdle(GenericObjectPoolConfig.DEFAULT_MIN_IDLE * 2);
// 设置开启jmx功能
poolConfig.setJmxEnabled(true);
// 设置连接池没有连接后客户端的最大等待时间(单位为毫秒)
poolConfig.setMaxWaitMillis(3000);
2)获取Jedis对象不再是直接生成一个Jedis对象进行直连,而是从连接池直接获取
![](https://img.haomeiwen.com/i17993869/cf9df55b1e138101.png)
4.Redis中Pipeline的使用方法
Jedis支持Pipeline特性,我们知道 Redis提供了mget、mset方法,但是并没有提供mdel方法,如果想实现这个功 能,可以借助Pipeline来模拟批量删除,下面代码是mdel删除的实现过程。
![](https://img.haomeiwen.com/i17993869/bc7a9439fbeedf16.png)
·利用jedis对象生成一个pipeline对象,直接可以调用 jedis.pipelined()。
·将del命令封装到pipeline中,可以调用pipeline.del(String key),这个 方法和jedis.del(String key)的写法是完全一致的,只不过此时不会真正的执行命令。
·使用pipeline.sync()完成此次pipeline对象的调用。
除了pipeline.sync(),还可以使用pipeline.syncAndReturnAll()将 pipeline的命令进行返回,例如下面代码将set和incr做了一次pipeline操作,并顺序打印了两个命令的结果:
![](https://img.haomeiwen.com/i17993869/dccc6896f1392927.png)
输出结果为:
OK
1
5.Jedis的Lua脚本
Jedis中执行Lua脚本和redis-cli十分类似,Jedis提供了三个重要的函数实 现Lua脚本的执行:
Object eval(String script, int keyCount, String... params)
Object evalsha(String sha1, int keyCount, String... params)
String scriptLoad(String script)
eval函数有三个参数,分别是:
·script:Lua脚本内容。
·keyCount:键的个数。
·params:相关参数KEYS和ARGV。
在redis-cli中执行上面的Lua脚本,方法如下:
127.0.0.1:6379> eval "return redis.call('get',KEYS[1])" 1 hello
"world"
在Jedis中执行,方法如下:
String key = "hello";
String script = "return redis.call('get',KEYS[1])";
Object result = jedis.eval(script, 1, key);
// 打印结果为world
System.out.println(result)
scriptLoad和evalsha函数要一起使用,首先使用scriptLoad将脚本加载到 Redis中,代码如下:
String scriptSha = jedis.scriptLoad(script);
Stirng key = "hello";
Object result = jedis.evalsha(scriptSha, 1, key);
// 打印结果为world
System.out.println(result);
evalsha函数用来执行脚本的SHA1校验和,它需要三个参数:
·scriptSha:脚本的SHA1。
·keyCount:键的个数。
·params:相关参数KEYS和ARGV
总体来说,Jedis的使用重点注意以下几点:
1)Jedis操作放在try catch finally里更加合理。
2)区分直连和连接池两种实现方式优缺点。
3)jedis.close()方法的两种实现方式。
4)Jedis依赖了common-pool,有关common-pool的参数需要根据不同的使用场景,各不相同,需要具体问题具体分析。
5)如果key和value涉及了字节数组,需要自己选择适合的序列化方法
网友评论