이 문서의 내용은 Redis 트랜잭션 작업의 명령 및 실행 작업(코드)에 대한 내용입니다. 필요한 친구가 참고할 수 있기를 바랍니다.
이 글에서는 주로 redis
command line
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"
상추 인스턴스
@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")); }
명령줄
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"
상추 인스턴스
@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")); }
@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)); }
레이드 제공 multi exec/discard 명령은 공개 커밋/롤백 트랜잭션과 유사하지만 exec는 유형 작업과 같은 오류가 발생하면 롤백되지 않습니다. 성공적으로 실행되어야 하는 명령은 계속해서 성공적으로 실행되고 실패해야 하는 명령은 계속해서 실행됩니다. 다중 실행은 exec 명령이 성공적으로 실행되는 한 트랜잭션의 일련의 명령이 실행될 수 있도록 보장합니다. 네트워크 문제 등으로 인해 서버에서 실행이 수신되지 않으면 일련의 명령이 실행됩니다.
discard를 실행해야 합니다. multi를 호출한 후에만 사용할 수 있습니다. 이 명령은 실행을 기다리는 트랜잭션 대기열을 지웁니다. 데이터베이스와 유사한 낙관적 잠금 메커니즘을 구현하기 위해 다중 실행과 함께 사용됩니다. 일단 감시 키가 다른 사람에 의해 사용되면 클라이언트가 업데이트되면 전체 실행 작업이 실패합니다
위 내용은 Redis 트랜잭션 작업 명령 및 실행 작업(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!