我想用StackExchange.Redis做一個基本的手錶。如果在交易過程中密鑰被更改,則失敗。如何用StackExchange.Redis做基本的手錶
StackExchange.Redis很好地將這個抽象爲「Condition」api,它支持「Equals」和「Exists」的概念。
這真的很好,但我想只是做一些像「不變」。我可能會錯過一些東西,但對於如何做到這一點,我並不明顯。
是否有可能做這樣的事情:
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代碼我明白轉化爲像(不知道如何準確,這是):
val = GET key
WATCH key
MULTI
val = val + 1
SET key $val
checkVal = GET key
(then if checkVal != val:) UNWATCH
(otherwise:) EXEC
我還在學習更多關於Redis的,但我不能肯定這樣做的好處是什麼。難道你最終的結果是更像這樣嗎?:
WATCH key
MULTI
val = GET key
val = val + 1
SET key $val
EXEC
或者這是不可能的方式SE.Redis的作品?
我將編輯我的答案以反映您的編輯 – 2014-11-07 17:07:05