StackExchange.Redis

时间:2015-05-04 20:08:15

标签: c# multithreading redis stackexchange.redis

我使用StackExchange.Redis包作为多线程应用程序的共享存储,然后同时在多个服务器上运行...所以多线程;)

我最简单的用例之一是我想对一系列密钥保持基本计数(即KEY1 = 4 KEY2 = 7,KEY3 = 13等)。并且我已经制定了业务规则来强制执行给定密钥允许的最大允许值。因此,例如,假设KEY1只能高达5 ......如果两个线程在尝试递增它的同时触发,我只想让其中一个成功。

我相信我可以通过首先获取当前值然后使其条件值没有改变来完成交易。这会像我期待的那样工作吗?有更优雅的方式吗?

    public void Increment(string key) {        
        IDatabase db = redisConn.GetDatabase();
        var val = db.StringGet(key);
        int maxVal = 5; 
        if (Convert.ToInt32(val) < maxVal) {
            var trans = db.CreateTransaction();
            trans.AddCondition(Condition.StringEqual(key, val));
            trans.StringIncrementAsync(key);
            trans.Execute();
        }
    }

PS:喜欢这个套餐,很高兴与

合作

1 个答案:

答案 0 :(得分:4)

是的,这应该可以正常工作。但是通过ScriptEvaluate使用Lua脚本可能更容易也更有效。

注意:使用您当前的代码,您可能需要检查Execute和&#34; redo from start&#34;的响应。如果false。如果在使用当前代码从2移动到3时发生线程争用:更新将被丢弃。这不会是Lua脚本的问题。