使用 StackExchange.Redis 进行线程安全的递增/递减

bru*_*ser 5 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

PS:喜欢这个包,很高兴与它合作

Mar*_*ell 5

是的,这应该可以正常工作。但是通过ScriptEvaluate.

注意:使用您当前的代码,您可能需要检查Execute和“从头开始重做”的响应if false。如果使用当前代码从 2 移动到 3 时发生线程竞争:更新将被丢弃。这不会是 Lua 脚本的问题。