小编给大家分享一下redis中事务操作的命令有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了凤台免费建站欢迎大家使用!
命令
命令行
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 connection = client.connect();
RedisCommands 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 connection = client.connect();
RedisCommands 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"));
} 命令行
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 connection = client.connect();
RedisCommands 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"));
} @Test
public void testWatch(){
RedisClient client = RedisClient.create("redis://192.168.99.100:6379/0");
StatefulRedisConnection connection = client.connect();
RedisCommands syncCommands = connection.sync();
String key = "key";
syncCommands.watch(key);
//another connection
StatefulRedisConnection conn2 = client.connect();
RedisCommands 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中事务操作的命令有哪些”有了一定的了解,如果想了解更多相关知识,欢迎关注创新互联行业资讯频道,感谢各位的阅读!