찾다
데이터 베이스RedisRedis의 트랜잭션에 대해 자세히 알아보기

이 기사에서는 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>팬텀 읽기 관련 문제(간단히 잠금으로 이해됨)


Redis 트랜잭션

🎜MULTI, EXEC, DISCARD 및 WATCH는 Redis 트랜잭션의 기본입니다. 트랜잭션을 명시적으로 시작하고 제어하는 ​​데 사용되며 일련의 명령을 한 단계로 실행할 수 있습니다. 그리고 두 가지 중요한 보장을 제공합니다: 🎜
  • 트랜잭션의 모든 명령은 직렬화되어 순서대로 실행됩니다. Redis 트랜잭션을 실행하는 동안 다른 클라이언트에서 발행한 요청은 발생하지 않습니다. 이렇게 하면 명령 대기열이 단일 원자성 작업으로 실행됩니다.
  • 큐의 모든 명령이 처리되거나 무시됩니다. EXEC 명령은 트랜잭션의 모든 명령 실행을 트리거하므로 클라이언트가 트랜잭션 컨텍스트에서 서버에 대한 연결이 끊어지면
  • MULTI 명령이 호출되기 전에 이 문제가 발생하면 가 없습니다. 명령
  • 이 실행됩니다. code>;
  • 이전에 EXEC 명령이 호출되면 모든 명령이 실행됩니다.
🎜동시에 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가 대기열에 실패함). 🎜
  • 예를 들어 명령에 구문 오류(잘못된 매개변수 수, 잘못된 명령 이름...)가 있을 수 있습니다.
  • 또는 some 일부 핵심 조건
, 예를 들어 메모리 부족(서버가 maxmemory 지시문을 사용하여 메모리 제한을 설정하는 경우). 🎜🎜클라이언트는 EXEC를 호출하기 전에 첫 번째 오류🎜를 감지합니다. 대기 중인 명령의 상태 응답을 확인하여(***참고: 이는 대기 중인상태 응답을 의미하며, >실행 결과***), 명령이 <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> 값 목록 작업)
    🎜🎜 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으로 문의하시기 바랍니다. 삭제
    왜 Redis를 사용합니까? 혜택과 장점왜 Redis를 사용합니까? 혜택과 장점Apr 14, 2025 am 12:07 AM

    Redis는 빠른 성능, 풍부한 데이터 구조, 고 가용성 및 확장 성, 지속성 기능 및 광범위한 생태계 지원을 제공하기 때문에 강력한 데이터베이스 솔루션입니다. 1) 매우 빠른 성능 : Redis의 데이터는 메모리에 저장되며 동시성이 높고 대기 시간이 낮은 응용 프로그램에 적합한 빠른 읽기 및 쓰기 속도를 가지고 있습니다. 2) 풍부한 데이터 구조 : 다양한 시나리오에 적합한 목록, 컬렉션 등과 같은 여러 데이터 유형을 지원합니다. 3) 고 가용성 및 확장 성 : 마스터 슬레이브 복제 및 클러스터 모드를 지원하여 고 가용성 및 수평 확장 성을 달성합니다. 4) 지속성 및 데이터 보안 : 데이터 지속성은 RDB 및 AOF를 통해 달성되어 데이터 무결성 및 신뢰성을 보장합니다. 5) 광범위한 생태계 및 지역 사회 지원 : 거대한 생태계와 활동적인 커뮤니티,

    NOSQL 이해 : Redis의 주요 기능NOSQL 이해 : Redis의 주요 기능Apr 13, 2025 am 12:17 AM

    Redis의 주요 기능에는 속도, 유연성 및 풍부한 데이터 구조 지원이 포함됩니다. 1) 속도 : Redis는 메모리 내 데이터베이스이며, 읽기 및 쓰기 작업은 거의 순간적이며 캐시 및 세션 관리에 적합합니다. 2) 유연성 : 복잡한 데이터 처리에 적합한 문자열, 목록, 컬렉션 등과 같은 여러 데이터 구조를 지원합니다. 3) 데이터 구조 지원 : 다양한 비즈니스 요구에 적합한 문자열, 목록, 컬렉션, 해시 테이블 등을 제공합니다.

    REDIS : 기본 기능을 식별합니다REDIS : 기본 기능을 식별합니다Apr 12, 2025 am 12:01 AM

    Redis의 핵심 기능은 고성능 인 메모리 데이터 저장 및 처리 시스템입니다. 1) 고속 데이터 액세스 : Redis는 메모리에 데이터를 저장하고 마이크로 초 수준 읽기 및 쓰기 속도를 제공합니다. 2) 풍부한 데이터 구조 : 문자열, 목록, 컬렉션 등을 지원하며 다양한 응용 프로그램 시나리오에 적응합니다. 3) 지속성 : RDB 및 AOF를 통해 디스크에 데이터를 지속하십시오. 4) 구독 게시 : 메시지 대기열 또는 실시간 통신 시스템에서 사용할 수 있습니다.

    Redis : 인기있는 데이터 구조에 대한 안내서Redis : 인기있는 데이터 구조에 대한 안내서Apr 11, 2025 am 12:04 AM

    Redis는 다음을 포함하여 다양한 데이터 구조를 지원합니다. 1. String, 단일 값 데이터 저장에 적합합니다. 2. 큐 및 스택에 적합한 목록; 3. 비면성 데이터 저장에 사용되는 세트; 4. 순서, 순위 목록 및 우선 순위 대기열에 적합한 순서 세트; 5. 해시 테이블, 객체 또는 구조화 된 데이터를 저장하는 데 적합합니다.

    Redis 카운터를 구현하는 방법Redis 카운터를 구현하는 방법Apr 10, 2025 pm 10:21 PM

    Redis Counter는 Redis Key-Value Pair 스토리지를 사용하여 다음 단계를 포함하여 계산 작업을 구현하는 메커니즘입니다. 카운터 키 생성, 카운트 증가, 카운트 감소, 카운트 재설정 및 카운트 얻기. Redis 카운터의 장점에는 빠른 속도, 높은 동시성, 내구성 및 단순성 및 사용 편의성이 포함됩니다. 사용자 액세스 계산, 실시간 메트릭 추적, 게임 점수 및 순위 및 주문 처리 계산과 같은 시나리오에서 사용할 수 있습니다.

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

    Redis Command Line 도구 (Redis-Cli)를 사용하여 다음 단계를 통해 Redis를 관리하고 작동하십시오. 서버에 연결하고 주소와 포트를 지정하십시오. 명령 이름과 매개 변수를 사용하여 서버에 명령을 보냅니다. 도움말 명령을 사용하여 특정 명령에 대한 도움말 정보를 봅니다. 종금 명령을 사용하여 명령 줄 도구를 종료하십시오.

    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:12 PM

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

    See all articles

    핫 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. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    VSCode Windows 64비트 다운로드

    VSCode Windows 64비트 다운로드

    Microsoft에서 출시한 강력한 무료 IDE 편집기

    Dreamweaver Mac版

    Dreamweaver Mac版

    시각적 웹 개발 도구

    MinGW - Windows용 미니멀리스트 GNU

    MinGW - Windows용 미니멀리스트 GNU

    이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

    Eclipse용 SAP NetWeaver 서버 어댑터

    Eclipse용 SAP NetWeaver 서버 어댑터

    Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.