복붙노트

[REDIS] 읽기 작업과 레디 스에서의 트랜잭션

REDIS

읽기 작업과 레디 스에서의 트랜잭션

레디 스를 사용하여, 나는 명령의 원자 순서, 순서가 실행되는 동안 다른 클라이언트가 데이터베이스에 변경을 수행 없다는 것을 보증에 즉 I 필요성을 수행 할.

내가 쓰기 명령을 사용하는 경우에만, 나는 자성 사용하여 트랜잭션을 보장하기 위해 MULTI 및 EXEC 문을 사용할 수 있습니다. 그러나 나는 또한처럼 내 거래에 읽기 명령을 사용하는 것입니다. 읽기 명령은 또한 대기되기 때문에 따라서 나는, MULTI을 사용할 수 없습니다!

기본적으로, 원자 방식으로, 나는 다음을 수행해야합니다

두 1.과 2. 단일 원자 트랜잭션의 일부가되어야한다.

그렇게하는 방법을 간단한 방법이 있습니까?

해결법

  1. ==============================

    1.문제에 대한 두 가지 좋은 솔루션이있다.

    문제에 대한 두 가지 좋은 솔루션이있다.

    옵션 1:

    당신은 당신이에서 읽고있는 키에 시계를 발행 할 필요가있다. 귀하의 거래는 다음과 같이 보일 것입니다 :

    WATCH x
    x = GET x
    MULTI
    SET y, f(x)
    EXEC
    

    이 예에서, 다중 블록 내부의 기록 명령은 원자 적으로 수행 될 것이지만, 경우에만 키 x의 값은 시계가 호출 된 이후 변경되지 않았. 이것은 낙관적 잠금이라고합니다. x의 값은 오류를 얻을 것이다 응용 프로그램을 변경 않을 가능성 x의 새 값을 사용하여 다시 시도되는, 다음에 무엇을 결정해야됩니다.

    옵션 2 :

    레디 스 지금 루아 스크립트를 지원하며, 루아 스크립트는 원자 적으로 실행됩니다. 당신이 루아 스크립트로 로직을 캡슐화 할 수 있다면, 당신은 모든 원자, 키를 읽을 당신의 F (x)의 논리를 실행하고 결과를 저장할 수 있습니다. 이 까다로운 또는 수행중인 논리에 따라도 아닌 옵션이 될 수 있습니다. 당신은 당신이 레디 스 실행하려는 스크립트에 직접 하드 코딩에 의해 루아에 패스 값과 같은 추한 해킹을 할 수도 있습니다. 당신이이 방법이 안정적이고 성능이 좋은 수 있어야 작업, 당신은 EXEC 실패를 처리를 처리하지 않아도 얻을 경우 즉, 말했다.

  2. from https://stackoverflow.com/questions/18452335/transactions-in-redis-with-read-operations by cc-by-sa and MIT license