redis 管道和事物

一、普通同步方式

最简单和基础的调用方式,

@Test
public void test1Normal() {
    Jedis jedis = new Jedis("localhost");
    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        String result = jedis.set("n" + i, "n" + i);
    }
    long end = System.currentTimeMillis();
    System.out.println("Simple SET: " + ((end - start)/1000.0) + " seconds");
    jedis.disconnect();
}

很简单吧,每次set之后都可以返回结果,标记是否成功。

二、事务方式(Transactions)

redis的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。

看下面例子:

@Test
public void test2Trans() {
    Jedis jedis = new Jedis("localhost");
    long start = System.currentTimeMillis();
    Transaction tx = jedis.multi();
    for (int i = 0; i < 100000; i++) {
        tx.set("t" + i, "t" + i);
    }
    List<Object> results = tx.exec();
    long end = System.currentTimeMillis();
    System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds");
    jedis.disconnect();
}

我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,我们可以使用discard()方法来取消事务。

三、管道(Pipelining)

有时,我们需要采用异步方式,一次发送多个指令,不同步等待其返回结果。这样可以取得非常好的执行效率。这就是管道,调用方法如下:

@Test
public void test3Pipelined() {
    Jedis jedis = new Jedis("localhost");
    Pipeline pipeline = jedis.pipelined();
    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        pipeline.set("p" + i, "p" + i);
    }
    List<Object> results = pipeline.syncAndReturnAll();
    long end = System.currentTimeMillis();
    System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
    jedis.disconnect();
}

管道和事务是不同的,pipeline只是表达“交互”中操作的传递的方向性,pipeline也可以在事务中运行,也可以不在。无论如何,pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的相应中得到信息;也就是pipeline并不是表达“所有command都一起成功”的语义,管道中前面命令失败,后面命令不会有影响,继续执行。简单来说就是管道中的命令是没有关系的,它们只是像管道一样流水发给server,而不是串行执行,仅此而已;但是如果pipeline的操作被封装在事务中,那么将有事务来确保操作的成功与失败。

一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令,管道命令执行过程中可以插入其他命令。
管道侧重点  效率高。
事物侧重点  一致性。

相同点 批量 异步。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Redis管道进行批量操作时,我们可以通过实体类来方便地进行对象的存储和读取。 首先,我们需要定义一个实体类来表示我们要存储的对象。这个实体类可以包含对象的各种属性和方法,以便我们可以方便地操作这些对象。例如,如果我们要存储用户对象,我们可以定义一个名为User的实体类,包含用户的姓名、年龄、性别等属性,以及一些操作用户对象的方法。 接下来,我们可以使用Redis管道功能来批量操作实体类的对象。管道Redis一个重要的特性,它可以将多个命令一次性发送给Redis服务器,从而减少网络延迟并提高性能。在批量操作实体类时,我们可以将多个对象的存储或读取命令一次性发送给Redis,减少与Redis服务器的通信次数。 具体而言,我们可以使用Redis管道功能来批量存储实体类对象。比如,我们可以使用管道一次性发出多个set命令,将多个用户对象存储到Redis中。同样地,我们也可以使用管道一次性发出多个get命令,一次性读取多个用户对象。 使用实体类存储和读取对象不仅方便了我们的代码实现,还可以将对象的数据结构进行模块化,提高代码的可读性和可维护性。而通过Redis管道功能进行批量操作,则可以进一步提高程序的执行效率和性能。 总之,通过Redis管道进行批量操作实体类对象,可以方便地进行存储和读取,同时也提高了程序的效率和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值