목차
Redis事务
用法
事务中的错误
Redis 트랜잭션
사용법
트랜잭션 오류
Redis事务不支持Rollback(重点
清除命令队列
데이터 베이스 Redis Redis의 트랜잭션에 대해 자세히 알아보기

Redis의 트랜잭션에 대해 자세히 알아보기

Apr 13, 2021 am 10:57 AM
redis 사무

이 기사에서는 Redis의 트랜잭션에 대해 자세히 설명합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다. ㅋㅋㅋ

Redis의 트랜잭션에 대해 자세히 알아보기WATCH

WATCH 키 [ key...]

주어진 모니터링 상태로 트랜잭션 실행항상 OK를 표시합니다.UNWATCH UNWATCH트랜잭션에서 모니터링 상태를 삭제하세요. EXECUNWATCH
또는 DISCARD가 호출되면 를 수동으로 호출할 필요가 없습니다. 항상 OK. Keys标记为监测态,作为事务执行的条件 always OK.
UNWATCH UNWATCH 清除事务中Keys监测态,如果调用了EXEC or DISCARD,则没有必要再手动调用UNWATCH always OK.
MULTI MULTI 显式开启redis事务,后续commands将排队,等候使用EXEC进行原子执行 always OK.
EXEC EXEC 执行事务中的commands队列,恢复连接状态。如果WATCH在之前被调用,只有监测中的Keys没有被修改,命令才会被执行,否则停止执行(详见下文,CAS机制 成功: 返回数组 —— 每个元素对应着原子事务中一个 command的返回结果;
失败: 返回NULLRuby 返回`nil`);
DISCARD DISCARD 清除事务中的commands队列,恢复连接状态。如果WATCH在之前被调用,释放 监测中的Keys MULTI
MULTI🎜🎜🎜명시적으로 redis 트랜잭션을 열면 후속 명령이 대기열에 추가됩니다. 대기 중 원자 실행을 위해 🎜EXEC🎜를 사용하세요 🎜🎜항상 괜찮습니다.🎜🎜🎜🎜🎜EXEC🎜🎜🎜🎜EXEC🎜🎜🎜트랜잭션에서 명령 대기열을 실행하고 연결 상태를 복원하세요. 🎜WATCH🎜가 이전에 호출된 경우 모니터링가 수정되지 않은 경우에만 명령이 실행되고, 그렇지 않으면 실행이 중지됩니다(자세한 내용은 아래 참조, CAS 메커니즘) 🎜🎜🎜성공: 🎜 반환 배열 - 각 요소는 원자 트랜잭션에서 명령의 반환 결과에 해당합니다.
🎜실패: 🎜 반환 NULL (Ruby`nil`을 반환함) 🎜🎜🎜🎜🎜DISCARD🎜🎜🎜🎜DISCARD🎜🎜🎜명령 지우기큐에서 연결 상태를 복원합니다. 🎜WATCH🎜가 이전에 호출된 경우 <code>Monitor🎜🎜에서 Release Keys는 항상 OK입니다.🎜🎜🎜🎜

참고:

------MULTI, EXEC, DISCARD명시적트랜잭션을 열고 제어하는 ​​일반적인 명령은 <code>관계형 데이터베이스BEGAIN, COMMIT, ROLLBACK과 비교할 수 있습니다. >( 실제로 그 차이는 엄청납니다.) MULTI,EXEC,DISCARD才是显式开启并控制事务的常用命令,可类比关系型数据库中的  BEGAIN,COMMIT,ROLLBACK(事实上,差距很大);

------WATCH命令的使用是为了解决 事务并发 产生的不可重复读幻读的问题(简单理解为给Key加锁);


Redis事务

MULTI, EXEC, DISCARD and WATCH 是Redis事务的基础。用来显式开启并控制一个事务,它们允许在一个步骤中执行一组命令。并提供两个重要的保证:

  • 事务中的所有命令都会被序列化并按顺序执行。在执行Redis事务的过程中,不会出现由另一个客户端发出的请求。这保证 命令队列 作为一个单独的原子操作被执行。
  • 队列中的命令要么全部被处理,要么全部被忽略。EXEC命令触发事务中所有命令的执行,因此,当客户端在事务上下文中失去与服务器的连接,
  • 如果发生在调用MULTI命令之前,则不执行任何commands
  • 如果在此之前EXEC命令被调用,则所有的commands都被执行。

同时,redis使用AOF(append-only file),使用一个额外的write操作将事务写入磁盘。如果发生宕机,进程奔溃等情况,可以使用redis-check-aof tool 修复append-only file,使服务正常启动,并恢复部分操作。


用法

使用MULTI命令显式开启Redis事务。 该命令总是以OK回应。此时用户可以发出多个命令,Redis不会执行这些命令,而是将它们排队EXEC被调用后,所有的命令都会被执行。而调用DISCARD可以清除事务中的commands队列退出事务

  • 以下示例以原子方式,递增键foo和bar。
>MULTI
OK
>INCR foo
QUEUED
>INCR bar
QUEUED
>EXEC
1)(整数)1
2)(整数)1
로그인 후 복사

从上面的命令执行中可以看出,EXEC返回一个数组其中每个元素都是事务中单个命令的返回结果,而且顺序与命令的发出顺序相同MULTI请求的上下文中时,所有命令将以字符串QUEUED从Redis协议的角度作为状态回复发送)作为回复,并在命令队列中排队。只有EXEC被调用时,排队的命令才会被执行,此时才会有真正的返回结果


事务中的错误

事务期间,可能会遇到两种命令错误:

  • 在调用EXEC命令之前出现错误(COMMAND排队失败)。
  • 例如,命令可能存在语法错误(参数数量错误,错误的命令名称...);
  • 或者可能存在某些关键条件,如内存不足的情况(如果服务器使用maxmemory指令做了内存限制)。

客户端会在EXEC调用之前检测第一种错误。 通过检查排队命令的状态回复(***注意:这里是指排队状态回复,而不是执行结果***),如果命令使用QUEUED进行响应,则它已正确排队,否则Redis将返回错误。如果排队命令时发生错误,大多数客户端将中止该事务并清除命令队列。然而:

  • Redis 2.6.5之前,这种情况下,在EXEC命令调用后,客户端会执行命令的子集(成功排队的命令)而忽略之前的错误。
  • Redis 2.6.5开始,服务端会记住在累积命令期间发生的错误,当EXEC命令调用时,将拒绝执行事务,并返回这些错误,同时自动清除命令队列
  • 示例如下:
>MULTI
+OK
>INCR a b c
-ERR wrong number of arguments for &#39;incr&#39; command
로그인 후 복사

这是由于INCR命令的语法错误,将在调用EXEC之前被检测出来,并终止事务(version2.6.5+)。

  • 在调用EXEC命令之后出现错误。
  • 例如,使用错误的值对某个key执行操作(如针对String值调用List操作)

EXEC命令执行之后发生的错误并不会被特殊对待即使事务中的某些命令执行失败,其他命令仍会被正常执行------WATCH 명령은 트랜잭션 동시성<으로 인해 발생하는 <code>반복 불가능한 읽기 문제를 해결하는 데 사용됩니다. /code> /code> 및 <code>팬텀 읽기 관련 문제(간단히 잠금으로 이해됨)


Redis 트랜잭션

🎜MULTI, EXEC, DISCARD 및 WATCH는 Redis 트랜잭션의 기본입니다. 트랜잭션을 명시적으로 시작하고 제어하는 ​​데 사용되며 일련의 명령을 한 단계로 실행할 수 있습니다. 그리고 두 가지 중요한 보장을 제공합니다: 🎜
  • 트랜잭션의 모든 명령은 직렬화되어 순서대로 실행됩니다. Redis 트랜잭션을 실행하는 동안 다른 클라이언트에서 발행한 요청은 발생하지 않습니다. 이렇게 하면 명령 대기열이 단일 원자성 작업으로 실행됩니다.
  • 큐의 모든 명령이 처리되거나 무시됩니다. EXEC 명령은 트랜잭션의 모든 명령 실행을 트리거하므로 클라이언트가 트랜잭션 컨텍스트에서 서버에 대한 연결이 끊어지면
  • MULTI 명령이 호출되기 전에 이 문제가 발생하면 가 없습니다. 명령</li>이 실행됩니다. code>;</li><li>이전에 EXEC 명령이 호출되면 모든 <code>명령이 실행됩니다.
🎜동시에 redis는 AOF(append-only를 사용합니다. 파일🎜 a>), 추가 쓰기 작업을 사용하여 트랜잭션을 디스크에 씁니다. 다운타임이나 프로세스 충돌이 발생하면 서비스가 정상적으로 시작되고 일부 작업을 재개할 수 있도록 redis-check-aof 도구를 사용하여 추가 전용 파일을 복구할 수 있습니다. 🎜

사용법

🎜 MULTI 명령을 사용하여 Redis 트랜잭션을 명시적으로 엽니다. 이 명령은 항상 OK로 응답합니다. 사용자는 현재 여러 명령을 실행할 수 있지만 Redis는 이러한 명령을 실행하지 않고 대기열에 추가합니다. EXEC가 호출되면 모든 명령이 실행됩니다. DISCARD를 호출하면 트랜잭션의 명령 대기열삭제하고 트랜잭션을 종료할 수 있습니다. 🎜
  • 다음 예에서는 foo 및 bar 키를 원자적으로 증가시킵니다.
>MULTI
+OK
>SET a 3
+QUEUED
>LPOP a
+QUEUED
>EXEC
*2
+OK
-ERR Operation against a key holding the wrong kind of value
로그인 후 복사
로그인 후 복사
🎜위 명령 실행에서 볼 수 있듯이 EXEC배열을 반환하며, 각 요소는 트랜잭션에 있습니다. 단일 명령에서 반환된 결과는 명령이 실행된 순서와 동일합니다. Redis 연결이 MULTI 요청의 컨텍스트에 있는 경우 모든 명령은 STRING QUEUED로 응답됩니다(🎜Redis 프로토콜의 관점에서 상태 응답으로 전송됨🎜). ) 및 명령 대기열의 대기열에 있습니다. EXEC가 호출될 때만 대기 중인 명령이 실행되고 실제 반환 결과가 나타납니다. 🎜

트랜잭션 오류

🎜🎜트랜잭션 중에 두 가지 명령 오류가 발생할 수 있습니다: 🎜🎜
  • 🎜호출할 때 오류 EXEC 명령 전에 발생했습니다(COMMAND가 대기열에 실패함). 🎜
  • 예를 들어 명령에 구문 오류(잘못된 매개변수 수, 잘못된 명령 이름...)가 있을 수 있습니다.
  • 또는 < code>some 일부 핵심 조건, 예를 들어 메모리 부족(서버가 maxmemory 지시문을 사용하여 메모리 제한을 설정하는 경우).
🎜🎜클라이언트는 EXEC를 호출하기 전에 첫 번째 오류🎜를 감지합니다. 대기 중인 명령의 상태 응답을 확인하여(***참고: 이는 대기 중인상태 응답을 의미하며, >실행 결과< /code>***), 명령이 <code>QUEUED로 응답하면 올바르게 대기열에 추가된 것입니다. 그렇지 않으면 Redis가 오류를 반환합니다. 명령을 대기열에 넣는 동안 오류가 발생하면 대부분의 클라이언트는 트랜잭션을 중단하고 명령 대기열을 지웁니다. 그러나: 🎜
  • Redis 2.6.5 이전에는 이 경우 EXEC 명령이 호출된 후 클라이언트가 명령의 하위 집합을 실행합니다( 성공적으로 대기열에 추가된 명령) 이전 오류를 무시합니다.
  • Redis 2.6.5부터 서버는 EXEC 명령이 호출될 때 명령이 누적되는 동안 발생한 오류를 기억하게 됩니다. > 트랜잭션 실행이 거부되고 해당 오류가 반환되며 명령 대기열이 자동으로 지워집니다.
  • 예제는 다음과 같습니다.
> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
> GET foo
"1"
로그인 후 복사
로그인 후 복사
🎜🎜<를 호출하기 전에 실행되는 INCR 명령의 구문 오류로 인해 발생합니다. code>EXEC 이를 감지하고 트랜잭션을 종료합니다(버전2.6.5+). 🎜
  • 🎜EXEC 명령을 호출한 후 오류가 발생했습니다. 🎜
  • 예를 들어 잘못된 값을 사용하여 에 대한 작업을 수행하는 경우(예: 문자열</code에서 <code> 호출) code> 값 목록 작업)
🎜🎜 EXEC 명령 실행 후 발생하는 오류는 특별히 처리되지 않습니다.🎜: 일부 명령이 발생하더라도 실패하더라도 다른 명령은 정상적으로 실행됩니다. 🎜
  • 示例如下:
>MULTI
+OK
>SET a 3
+QUEUED
>LPOP a
+QUEUED
>EXEC
*2
+OK
-ERR Operation against a key holding the wrong kind of value
로그인 후 복사
로그인 후 복사
  • EXEC返回一个包含两个元素的字符串数组,一个元素是OK,另一个是-ERR……
  • 能否将错误合理的反馈给用户这取决于客户端library(如:Spring-data-redis.redisTemplate)的自身实现。
  • 需要注意的是,即使命令失败,队列中的所有其他命令也会被处理----Redis不会停止命令的处理

Redis事务不支持Rollback(重点

事实上Redis命令在事务执行时可能会失败,但仍会继续执行剩余命令而不是Rollback(事务回滚)。如果你使用过关系数据库,这种情况可能会让你感到很奇怪。然而针对这种情况具备很好的解释:

  • Redis命令可能会执行失败,仅仅是由于错误的语法被调用(命令排队时检测不出来的错误),或者使用错误的数据类型操作某个Key: 这意味着,实际上失败的命令都是编程错误造成的,都是开发中能够被检测出来的,生产环境中不应该存在。(这番话,彻底甩锅,“都是你们自己编程错误,与我们无关”。)
  • 由于不必支持Rollback,Redis内部简洁并且更加高效。

如果错误就是发生了呢?”这是一个反对Redis观点的争论。然而应该指出的是,通常情况下,回滚并不能挽救编程错误。鉴于没有人能够挽救程序员的错误,并且Redis命令失败所需的错误类型不太可能进入生产环境,所以我们选择了不支持错误回滚(Rollback)这种更简单快捷的方法。


清除命令队列

DISCARD被用来中止事务。事务中的所有命令将不会被执行,连接将恢复正常状态。

> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
> GET foo
"1"
로그인 후 복사
로그인 후 복사

更多编程相关知识,请访问:编程视频!!

위 내용은 Redis의 트랜잭션에 대해 자세히 알아보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Redis 클러스터 모드를 구축하는 방법 Redis 클러스터 모드를 구축하는 방법 Apr 10, 2025 pm 10:15 PM

Redis Cluster Mode는 Sharding을 통해 Redis 인스턴스를 여러 서버에 배포하여 확장 성 및 가용성을 향상시킵니다. 시공 단계는 다음과 같습니다. 포트가 다른 홀수 redis 인스턴스를 만듭니다. 3 개의 센티넬 인스턴스를 만들고, Redis 인스턴스 및 장애 조치를 모니터링합니다. Sentinel 구성 파일 구성, Redis 인스턴스 정보 및 장애 조치 설정 모니터링 추가; Redis 인스턴스 구성 파일 구성, 클러스터 모드 활성화 및 클러스터 정보 파일 경로를 지정합니다. 각 redis 인스턴스의 정보를 포함하는 Nodes.conf 파일을 작성합니다. 클러스터를 시작하고 Create 명령을 실행하여 클러스터를 작성하고 복제본 수를 지정하십시오. 클러스터에 로그인하여 클러스터 정보 명령을 실행하여 클러스터 상태를 확인하십시오. 만들다

Redis 데이터를 지우는 방법 Redis 데이터를 지우는 방법 Apr 10, 2025 pm 10:06 PM

Redis 데이터를 지우는 방법 : Flushall 명령을 사용하여 모든 키 값을 지우십시오. FlushDB 명령을 사용하여 현재 선택한 데이터베이스의 키 값을 지우십시오. 선택을 사용하여 데이터베이스를 전환 한 다음 FlushDB를 사용하여 여러 데이터베이스를 지우십시오. del 명령을 사용하여 특정 키를 삭제하십시오. Redis-Cli 도구를 사용하여 데이터를 지우십시오.

Redis 명령을 사용하는 방법 Redis 명령을 사용하는 방법 Apr 10, 2025 pm 08:45 PM

Redis 지시 사항을 사용하려면 다음 단계가 필요합니다. Redis 클라이언트를 엽니 다. 명령 (동사 키 값)을 입력하십시오. 필요한 매개 변수를 제공합니다 (명령어마다 다름). 명령을 실행하려면 Enter를 누르십시오. Redis는 작업 결과를 나타내는 응답을 반환합니다 (일반적으로 OK 또는 -err).

Redis Lock을 사용하는 방법 Redis Lock을 사용하는 방법 Apr 10, 2025 pm 08:39 PM

Redis를 사용하여 잠금 작업을 사용하려면 SetNX 명령을 통해 잠금을 얻은 다음 만료 명령을 사용하여 만료 시간을 설정해야합니다. 특정 단계는 다음과 같습니다. (1) SETNX 명령을 사용하여 키 값 쌍을 설정하십시오. (2) 만료 명령을 사용하여 잠금의 만료 시간을 설정하십시오. (3) DEL 명령을 사용하여 잠금이 더 이상 필요하지 않은 경우 잠금을 삭제하십시오.

단일 스레드 레 디스를 사용하는 방법 단일 스레드 레 디스를 사용하는 방법 Apr 10, 2025 pm 07:12 PM

Redis는 단일 스레드 아키텍처를 사용하여 고성능, 단순성 및 일관성을 제공합니다. 동시성을 향상시키기 위해 I/O 멀티플렉싱, 이벤트 루프, 비 블로킹 I/O 및 공유 메모리를 사용하지만 동시성 제한 제한, 단일 고장 지점 및 쓰기 집약적 인 워크로드에 부적합한 제한이 있습니다.

Redis 대기열을 읽는 방법 Redis 대기열을 읽는 방법 Apr 10, 2025 pm 10:12 PM

Redis의 대기열을 읽으려면 대기열 이름을 얻고 LPOP 명령을 사용하여 요소를 읽고 빈 큐를 처리해야합니다. 특정 단계는 다음과 같습니다. 대기열 이름 가져 오기 : "큐 :"와 같은 "대기열 : my-queue"의 접두사로 이름을 지정하십시오. LPOP 명령을 사용하십시오. 빈 대기열 처리 : 대기열이 비어 있으면 LPOP이 NIL을 반환하고 요소를 읽기 전에 대기열이 존재하는지 확인할 수 있습니다.

기본 Redis를 구현하는 방법 기본 Redis를 구현하는 방법 Apr 10, 2025 pm 07:21 PM

Redis는 해시 테이블을 사용하여 데이터를 저장하고 문자열, 목록, 해시 테이블, 컬렉션 및 주문한 컬렉션과 같은 데이터 구조를 지원합니다. Redis는 Snapshots (RDB)를 통해 데이터를 유지하고 WRITE 전용 (AOF) 메커니즘을 추가합니다. Redis는 마스터 슬레이브 복제를 사용하여 데이터 가용성을 향상시킵니다. Redis는 단일 스레드 이벤트 루프를 사용하여 연결 및 명령을 처리하여 데이터 원자력과 일관성을 보장합니다. Redis는 키의 만료 시간을 설정하고 게으른 삭제 메커니즘을 사용하여 만료 키를 삭제합니다.

Redis의 소스 코드를 읽는 방법 Redis의 소스 코드를 읽는 방법 Apr 10, 2025 pm 08:27 PM

Redis 소스 코드를 이해하는 가장 좋은 방법은 단계별로 이동하는 것입니다. Redis의 기본 사항에 익숙해집니다. 특정 모듈을 선택하거나 시작점으로 기능합니다. 모듈 또는 함수의 진입 점으로 시작하여 코드를 한 줄씩 봅니다. 함수 호출 체인을 통해 코드를 봅니다. Redis가 사용하는 기본 데이터 구조에 익숙해 지십시오. Redis가 사용하는 알고리즘을 식별하십시오.

See all articles