最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Redis的事务操作的命令与执行操作(代码)

来源:动视网 责编:小采 时间:2020-11-09 08:41:19
文档

Redis的事务操作的命令与执行操作(代码)

Redis的事务操作的命令与执行操作(代码):本篇文章给大家带来的内容是关于Redis的事务操作的命令与执行操作(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。序本文主要研究一下redis的事务操作命令multi与exec命令行127.0.0.1:6379> multi OK 127.0.0
推荐度:
导读Redis的事务操作的命令与执行操作(代码):本篇文章给大家带来的内容是关于Redis的事务操作的命令与执行操作(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。序本文主要研究一下redis的事务操作命令multi与exec命令行127.0.0.1:6379> multi OK 127.0.0


本篇文章给大家带来的内容是关于Redis的事务操作的命令与执行操作(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

本文主要研究一下redis的事务操作

命令

multi与exec

  • 命令行

  • 127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> incr total
    QUEUED
    127.0.0.1:6379> incr len
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 2
    2) (integer) 2
    127.0.0.1:6379> get total
    "2"
    127.0.0.1:6379> get len
    "2"
  • lettuce实例

  •  @Test
     public void testMultiExec(){
     RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
     StatefulRedisConnection<String, String> connection = client.connect();
     RedisCommands<String, String> syncCommands = connection.sync();
    
     syncCommands.set("hello","1");
     syncCommands.set("world","2");
    
     syncCommands.multi();
     syncCommands.incr("hello");
     syncCommands.incr("world");
    
     //DefaultTransactionResult[wasRolledBack=false,result=[1, 2, 1, 3, 1]]
     TransactionResult transactionResult = syncCommands.exec();
     System.out.println(transactionResult);
     System.out.println(syncCommands.get("hello"));
     System.out.println(syncCommands.get("world"));
     }

    部分执行

  • 命令行

  • 127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set a hello
    QUEUED
    127.0.0.1:6379> set b world
    QUEUED
    127.0.0.1:6379> incr a
    QUEUED
    127.0.0.1:6379> set c part
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) OK
    3) (error) ERR value is not an integer or out of range
    4) OK
    127.0.0.1:6379> get a
    "hello"
    127.0.0.1:6379> get b
    "world"
    127.0.0.1:6379> get c
    "part"
  • lettuce实例

  •  @Test
     public void testMultiExecError(){
     RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
     StatefulRedisConnection<String, String> connection = client.connect();
     RedisCommands<String, String> syncCommands = connection.sync();
    
     syncCommands.multi();
     syncCommands.set("a","hello");
     syncCommands.set("b","world");
     syncCommands.incr("a");
     syncCommands.set("c","part");
     //DefaultTransactionResult[wasRolledBack=false,result=[OK, OK, io.lettuce.core.RedisCommandExecutionException: ERR value is not an integer or out of range, OK, 1]]
     TransactionResult transactionResult = syncCommands.exec();
     System.out.println(transactionResult);
     System.out.println(syncCommands.get("a"));
     System.out.println(syncCommands.get("b"));
     System.out.println(syncCommands.get("c"));
     }

    multi与discard

  • 命令行

  • 127.0.0.1:6379> set sum 1
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> incr sum
    QUEUED
    127.0.0.1:6379> discard
    OK
    127.0.0.1:6379> get sum
    "1"
  • lettuce实例

  •  @Test
     public void testMultiDiscard(){
     RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
     StatefulRedisConnection<String, String> connection = client.connect();
     RedisCommands<String, String> syncCommands = connection.sync();
     syncCommands.incr("key1");
     syncCommands.multi();
     syncCommands.incr("key1");
     //需要有multi才可以执行discard,成功返回OK
     String result = syncCommands.discard();
     System.out.println(result);
     System.out.println(syncCommands.get("key1"));
     }

    check and set

     @Test
     public void testWatch(){
     RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
     StatefulRedisConnection<String, String> connection = client.connect();
     RedisCommands<String, String> syncCommands = connection.sync();
    
     String key = "key";
     syncCommands.watch(key);
    
     //another connection
     StatefulRedisConnection<String, String> conn2 = client.connect();
     RedisCommands<String, String> syncCommands2 = conn2.sync();
     syncCommands2.set(key, "a");
    
     syncCommands.multi();
     syncCommands.append(key, "b");
     //DefaultTransactionResult [wasRolledBack=true, responses=0]
     TransactionResult transactionResult = syncCommands.exec();
     System.out.println(transactionResult);
    
     System.out.println(syncCommands.get(key));
     }

    小结

  • reids提供multi exec/discard指令,类似open commit/rollback transaction,不过exec遇到类型操作等错误时不会滚,该成功执行的命令还是成功执行,该失败的还是失败

  • multi exec保证的是,只要exec命令有执行成功,则事务中一系列的命令都能执行,如果exec因为网络等问题,server端没有接收到,则事务中的一系列命令都不会被执行

  • discard需要在有调用multi的前提下才能使用,该命令会清空事务队列等待执行的命令

  • redis提供watch指令,可以配合multi exec来使用,可以实现类似数据库的乐观锁的机制,一旦watch的key被其他client有更新,则整个exec操作失败

  • 文档

    Redis的事务操作的命令与执行操作(代码)

    Redis的事务操作的命令与执行操作(代码):本篇文章给大家带来的内容是关于Redis的事务操作的命令与执行操作(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。序本文主要研究一下redis的事务操作命令multi与exec命令行127.0.0.1:6379> multi OK 127.0.0
    推荐度:
    标签: 操作 代码 操作的
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top