[REDIS] 읽기 작업과 레디 스에서의 트랜잭션
REDIS읽기 작업과 레디 스에서의 트랜잭션
레디 스를 사용하여, 나는 명령의 원자 순서, 순서가 실행되는 동안 다른 클라이언트가 데이터베이스에 변경을 수행 없다는 것을 보증에 즉 I 필요성을 수행 할.
내가 쓰기 명령을 사용하는 경우에만, 나는 자성 사용하여 트랜잭션을 보장하기 위해 MULTI 및 EXEC 문을 사용할 수 있습니다. 그러나 나는 또한처럼 내 거래에 읽기 명령을 사용하는 것입니다. 읽기 명령은 또한 대기되기 때문에 따라서 나는, MULTI을 사용할 수 없습니다!
기본적으로, 원자 방식으로, 나는 다음을 수행해야합니다
두 1.과 2. 단일 원자 트랜잭션의 일부가되어야한다.
그렇게하는 방법을 간단한 방법이 있습니까?
해결법
-
==============================
1.문제에 대한 두 가지 좋은 솔루션이있다.
문제에 대한 두 가지 좋은 솔루션이있다.
옵션 1:
당신은 당신이에서 읽고있는 키에 시계를 발행 할 필요가있다. 귀하의 거래는 다음과 같이 보일 것입니다 :
WATCH x x = GET x MULTI SET y, f(x) EXEC
이 예에서, 다중 블록 내부의 기록 명령은 원자 적으로 수행 될 것이지만, 경우에만 키 x의 값은 시계가 호출 된 이후 변경되지 않았. 이것은 낙관적 잠금이라고합니다. x의 값은 오류를 얻을 것이다 응용 프로그램을 변경 않을 가능성 x의 새 값을 사용하여 다시 시도되는, 다음에 무엇을 결정해야됩니다.
옵션 2 :
레디 스 지금 루아 스크립트를 지원하며, 루아 스크립트는 원자 적으로 실행됩니다. 당신이 루아 스크립트로 로직을 캡슐화 할 수 있다면, 당신은 모든 원자, 키를 읽을 당신의 F (x)의 논리를 실행하고 결과를 저장할 수 있습니다. 이 까다로운 또는 수행중인 논리에 따라도 아닌 옵션이 될 수 있습니다. 당신은 당신이 레디 스 실행하려는 스크립트에 직접 하드 코딩에 의해 루아에 패스 값과 같은 추한 해킹을 할 수도 있습니다. 당신이이 방법이 안정적이고 성능이 좋은 수 있어야 작업, 당신은 EXEC 실패를 처리를 처리하지 않아도 얻을 경우 즉, 말했다.
from https://stackoverflow.com/questions/18452335/transactions-in-redis-with-read-operations by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스 필드의 값을 기준으로 해시를 찾는 (0) | 2020.01.06 |
---|---|
[REDIS] 어떻게 여러 서버에 socket.io 전송 메시지는 무엇입니까? (0) | 2020.01.06 |
[REDIS] 레디 스 - 큰지도를 저장하는 가장 좋은 방법 (사전) (0) | 2020.01.05 |
[REDIS] Node.js를 쿠에 실패한 작업을 다시 시작하는 방법 (0) | 2020.01.05 |
[REDIS] 직접 밖으로 레디 스 캐시의 콘텐츠를 제공하기 위해 nginx를 사용 (0) | 2020.01.05 |