복붙노트

[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. ==============================

    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 힘하면 다음이 변경되지 주장에 값을 비교할 수 있도록 트랜잭션의 미리 값을 가져 오는의 경로 아래로. 동일한 결과; 약간 다른 접근 방식은,하지만 멀티플렉서 안전합니다. 그 주제에 대한 자세한 내용은 여기를 참조하십시오.

  2. from https://stackoverflow.com/questions/26789720/how-to-do-basic-watch-with-stackexchange-redis by cc-by-sa and MIT license