Redis和乐观并发控制:可能吗?

ws51t4hk  于 2023-10-15  发布在  Redis
关注(0)|答案(3)|浏览(180)

在一个应用程序中工作,该应用程序将实体存储在redis中作为序列化的二进制blob。我有多个客户端在同一个数据集上工作,我希望使用乐观并发。
我的要求是:
1.在一次往返中读取特定键的序列化实体
1.将modifiend实体写回redis。如果任何其他客户端在读取和写入之间修改了该实体,则操作将失败
在Redis可以做这个吗?如果是这样:应该执行什么redis命令来实现这一点?

vs91vp4v

vs91vp4v1#

WATCH keyGET keyMULTISET key,然后EXEC。如果在执行WATCH后键的值发生了变化,EXEC将失败。
http://redis.io/topics/transactions#cas

gr8qqesn

gr8qqesn2#

对于任何使用StackExchange.Redis库的人,请记住它多路复用单个连接,上面描述的检查和设置模式可能无法像预期的那样用于共享该连接的2个请求。请参阅docs中的这篇文章:link

eulz3vhy

eulz3vhy3#

感谢我的老板,他发明了它,我执行了可靠并发的StackExchange.Redis实现。这是一个检查是否已完成向RedisSet添加项的示例
场景:您需要在不同的流程中处理一批物料。当批处理完成时,您希望只有一个线程报告此完成。在这个场景中,我使用Set来继续添加项。一旦Set被填充,我需要报告一次。

public bool HasComletedRedisSet(string value, long expected)
{
    long actualCount = 0;
    bool added = _db.SetAdd("key1", value);
    if (added)
    {
        actualCount = _db.StringIncrement("key2", 1L);
    }
    return (actualCount == expectedTotalCount);
}

这段代码是可靠并发的,只有1次返回true ...没有交易
当使用Redis并发时,人们可能会尝试考虑负面的场景。

相关问题