[REDIS] 어떻게 StackExchange.Redis 기본적인 시계를 할 수
REDIS어떻게 StackExchange.Redis 기본적인 시계를 할 수
나는 StackExchange.Redis와 기본 시계를 할 싶습니다. 키가 트랜잭션 중에 변경되는 경우 경우, 실패합니다.
StackExchange.Redis은 "같음"과 "존재"의 개념을 지원하는 "조건"API에 잘이를 추출했다.
그건 정말 좋은,하지만 난 그냥 "변경되지 않은"그런 짓을하고 싶습니다. 내가 뭔가를 누락 될 수 있지만, 그 작업을 수행하는 방법에 대한이 시점에서 나에게 분명 아니다.
이 같은 것을 할 수 있습니다 :
var transaction = redis.CreateTransaction();
transaction.AddCondition(Condition.StringUnchanged("key")); //the API here could maybe be simplified
var val = transaction.StringGet("key"); //notably, this is not async because you would have to get the result immediately - it would only work on watched keys
transaction.StringSetAsync("key", val + 1);
transaction.Execute();
심지어 가능한 더 나은 버전 (같은 일을 할 것이다) :
var transaction = redis.CreateTransaction();
var val = transaction.Watch("key"); //this would return the value!
transaction.StringSetAsync("key", val + 1);
transaction.Execute();
현재 내가이 일을 이해하는 유일한 방법은의 라인을 따라 뭔가를하는 것입니다 :
var val = redis.StringGet("key");
var transaction = redis.CreateTransaction();
transaction.AddCondition(Condition.StringEqual("key", val));
transaction.StringSetAsync("key", val + 1);
transaction.Execute();
SE.Redis 코드를 읽기에서 시도에서 어떤 I (이 확실하지 얼마나 정확한지) 같은 것으로 번역하는 이해 :
val = GET key
WATCH key
MULTI
val = val + 1
SET key $val
checkVal = GET key
(then if checkVal != val:) UNWATCH
(otherwise:) EXEC
나는 아직도 더 레디 스에 대해 배우고,하지만 난 확신이의 장점이 무엇인지 모르겠어요. 당신은 오히려 최종 결과는 더 같은 것을하지 않을까요?
WATCH key
MULTI
val = GET key
val = val + 1
SET key $val
EXEC
또는 SE.Redis의 작동 방식과이 가능하지?
해결법
-
==============================
1.시계가 직접 노출되지 않는 이유 때문에 SE.Redis가 하나의 연결에서 다른 호출 스택에서 다중 명령을 설계하는 방법이다. 트랜잭션 작업은 매우 엄격하게 관리 할 수 있도록 이것은 필요합니다.
시계가 직접 노출되지 않는 이유 때문에 SE.Redis가 하나의 연결에서 다른 호출 스택에서 다중 명령을 설계하는 방법이다. 트랜잭션 작업은 매우 엄격하게 관리 할 수 있도록 이것은 필요합니다.
내가 불분명 나는 꽤 무엇을 목적으로 "변화"일부 알려진 값과 비교하지 않고, 자체 것 - 그렇지 않으면 당신은 단지 경쟁 조건을 만드는 것입니다. 확실히에 대한 지원을 추가 할 수있을 것입니다,하지만 난 정말 같이 먼저 예상되는 사용 사례를 이해하는 것입니다. 당신은 설명 할 수 있습니까?
당신의 편집을 다시; 선호하는 예 (마지막)는 단순히 레디 스 불가능 - SE.Redis와는 아무; 당신이 MULTI 내부 GET를 할 경우, 당신은 EXEC이 완료 될 때까지 답을하지 않는다 - 당신은 아마도 SET의 값을 사용할 수 있도록 : 아직 사용할 수 없습니다.
이 다중화 아니었다면, 당신은 재 주문 두 번째 예를 수있는 비트 (SE.Redis가하는 일 기준) :
WATCH key val = GET key MULTI val = val + 1 SET key $val EXEC
이 시계의 전형적인 사용하지 : 당신은 당신이있는 거 질의 사전에, 당신은이 루프 동안 변하지입니다 {키}을 알고 일을보고 (또는 적어도, 트랜잭션이 중단 것이다; 더 일관성이없는 상태). 그러나 시계는 멀티플렉서, 잘 재생되지 않는 이유 SE.Redis 힘하면 다음이 변경되지 주장에 값을 비교할 수 있도록 트랜잭션의 미리 값을 가져 오는의 경로 아래로. 동일한 결과; 약간 다른 접근 방식은,하지만 멀티플렉서 안전합니다. 그 주제에 대한 자세한 내용은 여기를 참조하십시오.
from https://stackoverflow.com/questions/26789720/how-to-do-basic-watch-with-stackexchange-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 방법을 잘 내 이벤트 내 응용 프로그램의 하나의 인스턴스에 의해 처리됩니다 만들려면? (0) | 2020.01.25 |
---|---|
[REDIS] 그것은 FUSE 파일 시스템과 리눅스 VFS 캐시를 가질 수 있습니까? (0) | 2020.01.25 |
[REDIS] 레디 스에서 효율적인 인덱스 유형 작업 (0) | 2020.01.25 |
[REDIS] 큰 ETA와 예약 셀러리 작업 (0) | 2020.01.25 |
[REDIS] AWS 람다와 레디 스 클라이언트. 이유는 콜백을 호출 할 수 없습니다? (0) | 2020.01.25 |