共计 3651 个字符,预计需要花费 10 分钟才能阅读完成。
自动写代码机器人,免费开通
丸趣 TV 小编给大家分享一下 Redis 中事务操作的命令有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
命令
multi 与 exec
命令行
127.0.0.1:6379 multi
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
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
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
127.0.0.1:6379 multi
127.0.0.1:6379 incr sum
QUEUED
127.0.0.1:6379 discard
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 中事务操作的命令有哪些”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!
向 AI 问一下细节