Jedis对管道、事务以及Watch的操作详细解析

1、Pipeline

利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。所以pipeline适合批处理作业可以提升效率如:

public static void testMget() {
        Jedis jedis = RedisCacheClient.getInstrance().getClient();
        Set<String> keys = jedis.keys("cvfeedBackHandl_*");
        List<String> result = Lists.newArrayList();
        long t1 = System.currentTimeMillis();
        for (String key : keys) {
            result.add(jedis.get(key));
        }
        for (String src : result) {
            System.out.println(src);
        }
        System.out.println(System.currentTimeMillis() - t1);
    }

    public static void testPipline() {
        Jedis jedis = RedisCacheClient.getInstrance().getClient();
        Set<String> keys = jedis.keys("cvfeedBackHandl_*");
        List<Object> result = Lists.newArrayList();
        Pipeline pipelined = jedis.pipelined();
        long t1 = System.currentTimeMillis();
        for (String key : keys) {
            pipelined.<span style="font-family: Arial;">get</span>("testabcd");
        }
        result = pipelined.syncAndReturnAll();
        for (Object src : result) {
            System.out.println(src);
        }
        System.out.println(System.currentTimeMillis() - t1);
    }
如第一个方法执行的时间是82ms

第二个方法执行的时间是9ms

注意:pipeline和事务都是异步调用返回结果的,即并不是等待每条命令执行完立马返回结果而是等待所有命令执行完之后再返回结果。pipelined.syncAndReturnAll()返回的是参与打包执行的每条命令的结果。如果上面改成:

for (String key : keys) {//keys长度为5
            pipelined.get(key);
            pipelined.del("testabcd");
 }
返回结果将是

"test1"
1
"test2"
0
"test2"
0
"test4"
0
"test5"
0

2、事务

  事务是保证事务内的所有命令是原子操作,一般配合watch使用,事务的执行结果和pipeline一样都是采用异步的方式获取结果,multi.exec()提交事务,如果执行成功,其返回的结果和pipeline一样是所有命令的返回值,如果事务里面有两个命令那么事务的exec返回值会把两个命令的返回值组合在一起返回。如果事务被取消返回null。

3、watch

一般是和事务一起使用,当对某个key进行watch后如果其他的客户端对这个key进行了更改,那么本次事务会被取消,事务的exec会返回null。jedis.watch(key)都会返回OK
eg:

 public static void testWach(){
        Jedis jedis = RedisCacheClient.getInstrance().getClient();
        String watch = jedis.watch("testabcd");
        System.out.println(Thread.currentThread().getName()+"--"+watch);
        Transaction multi = jedis.multi();
        multi.set("testabcd", "23432");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        List<Object> exec = multi.exec();
        System.out.println("---"+exec);
        jedis.unwatch();
    }
    public static void testWatch2(){
        Jedis jedis = RedisCacheClient.getInstrance().getClient();
        String watch = jedis.watch("testabcd2");
        System.out.println(Thread.currentThread().getName()+"--"+watch);
        Transaction multi = jedis.multi();
        multi.set("testabcd", "125");
        List<Object> exec = multi.exec();
        System.out.println("--->>"+exec);
    }

Thread-2--OK
Thread-0--OK
--->>[OK]

---null//事务取消

4、事务与管道

     当对某个key进行watch时,如果其他的客户端对key进行了更改事务可以做到取消事务操作但是管道不可以

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值