Java客户端Jedis

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容