jedis基本介绍(2)

原文:https://github.com/xetorthio/jedis/wiki/AdvancedUsage

事务

在Jedis中使用事务,需要在一个事务块中包装一系列的操作,非常像pipelining:
1jedis.watch (key1, key2, ...);
2BinaryTransaction t = jedis.multi();
3t.set("foo", "bar");
4t.exec();

注意:当有一些方法有返回值,必须像下面这样做:
01Transaction t = jedis.multi();
02t.set("fool", "bar");
03Response<String> result1 = t.get("fool");
04 
05t.zadd("foo", 1, "barowitch");
06t.zadd("foo", 0, "barinsky");
07t.zadd("foo", 0, "barikoviev");
08Response<Set<String>> sose = t.zrange("foo", 0, -1);
09t.exec();                                          
10 
11String foolbar = result1.get();                      
12int soseSize = sose.get().size();                    
13 
14// List<Object> allResults = t.exec();                //可以立刻获取全部结果

注意Response对象在t.exec()被调用前是不会包含结果的。不调用exec会发生异常。
注意2:Redis不允许在一个事务内使用事务的中间结果。以下代码是不会正常运行的:
1jedis.watch(...);
2Transaction t = jedis.multi();
3if(t.get("key1").equals("something");
4   t.set("key2", "value2").
5else
6   t.set("key", "value");

然而,有一些像setnx的命令。这些在事务是被支持的。很快就可以使用LUA脚本来自定义命令.

Pipelining
有时需要发送一堆不同的指令。有一个很好的方式去执行,并且比原始的调用方式性能要好,就是使用pipelining.使用这种方式发送指令不用等待响应,是在最后读取返回值,更快.
以下是如何使用它:
01Pipeline p = jedis.pipelined();
02p.set("fool", "bar");
03p.zadd("foo", 1, "barowitch"); 
04p.zadd("foo", 0, "barinsky");
05p.zadd("foo", 0, "barikoviev");
06Response<String> pipeString = p.get("fool");
07Response<Set<String>> sose = p.zrange("foo", 0, -1);
08p.sync();
09 
10int soseSize = sose.get().size();
11Set<String> setBack = sose.get();


发布/订阅
在Redis中去订阅一个通道,需要创建JedisPubSub并且调用订阅方法
01class MyListener extends JedisPubSub {
02        public void onMessage(String channel, String message) {
03        }
04 
05        public void onSubscribe(String channel, int subscribedChannels) {
06        }
07 
08        public void onUnsubscribe(String channel, int subscribedChannels) {
09        }
10 
11        public void onPSubscribe(String pattern, int subscribedChannels) {
12        }
13 
14        public void onPUnsubscribe(String pattern, int subscribedChannels) {
15        }
16 
17        public void onPMessage(String pattern, String channel,
18            String message) {
19        }
20}
21 
22MyListener l = new MyListener();
23 
24jedis.subscribe(l, "foo");

注意订阅是一个阻塞的操作。单个的JedisPubSub实例可以被有来订阅多个通道。可以在已存在的JedisPubSub实例上调用subscribe或者psubscribe去改变订阅.

Jedis分片
动机
在普通的Redis主/从方式,通常有一个主服务器负责"write"请求,多个从服务器负责"read"请求。这就意味着用户必须小心有效的处理从服务器的负载分配。此外,只是"read"请求被分配到多个从服务器上,但是"write"请求没有,因为很可能只有一个主服务器。对于Jedis分片可以实现"read""write"两方面扩展性。分片使用的技术是"一致性哈希",根据一些哈希算法分配一些key.一个节点被叫做"片".更进一步的优势是每个片只需要有总数据集的1/n的内存. (n是加入从服务器的数目).
缺点

因为每个片是单独的主服务器,分片有一些限制的功能:例如,不能使用事务,pipelining,发布/订阅。然而,通常这些不允许的操作是可行的,只要关心keys在一个相同的片。更进一步的缺点是当前标准实现,在运行中的ShardedJedis不能添加或者移除片。如果需要这个特性,需要重现实现ShardedJedis,允许在一个运行ShardedJedis动态的添加和移除片: yaourt - dynamic sharding implementation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值