Java客户端Jedis

作者: huxt | 来源:发表于2019-06-26 11:58 被阅读0次

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连接关闭掉

3.Jedis连接池的使用方法

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对象进行直连,而是从连接池直接获取

4.Redis中Pipeline的使用方法

Jedis支持Pipeline特性,我们知道 Redis提供了mget、mset方法,但是并没有提供mdel方法,如果想实现这个功 能,可以借助Pipeline来模拟批量删除,下面代码是mdel删除的实现过程。

·利用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操作,并顺序打印了两个命令的结果:

输出结果为:

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涉及了字节数组,需要自己选择适合的序列化方法

相关文章

网友评论

    本文标题:Java客户端Jedis

    本文链接:https://www.haomeiwen.com/subject/fiwqcctx.html