在一个应用程序中工作,该应用程序将实体存储在redis中作为序列化的二进制blob。我有多个客户端在同一个数据集上工作,我希望使用乐观并发。我的要求是:1.在一次往返中读取特定键的序列化实体1.将modifiend实体写回redis。如果任何其他客户端在读取和写入之间修改了该实体,则操作将失败在Redis可以做这个吗?如果是这样:应该执行什么redis命令来实现这一点?
vs91vp4v1#
WATCH key,GET key,MULTI,SET key,然后EXEC。如果在执行WATCH后键的值发生了变化,EXEC将失败。http://redis.io/topics/transactions#cas
WATCH key
GET key
MULTI
SET key
EXEC
WATCH
gr8qqesn2#
对于任何使用StackExchange.Redis库的人,请记住它多路复用单个连接,上面描述的检查和设置模式可能无法像预期的那样用于共享该连接的2个请求。请参阅docs中的这篇文章:link
eulz3vhy3#
感谢我的老板,他发明了它,我执行了可靠并发的StackExchange.Redis实现。这是一个检查是否已完成向RedisSet添加项的示例场景:您需要在不同的流程中处理一批物料。当批处理完成时,您希望只有一个线程报告此完成。在这个场景中,我使用Set来继续添加项。一旦Set被填充,我需要报告一次。
StackExchange.Redis
RedisSet
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并发时,人们可能会尝试考虑负面的场景。
true
3条答案
按热度按时间vs91vp4v1#
WATCH key
,GET key
,MULTI
,SET key
,然后EXEC
。如果在执行WATCH
后键的值发生了变化,EXEC
将失败。http://redis.io/topics/transactions#cas
gr8qqesn2#
对于任何使用StackExchange.Redis库的人,请记住它多路复用单个连接,上面描述的检查和设置模式可能无法像预期的那样用于共享该连接的2个请求。请参阅docs中的这篇文章:link
eulz3vhy3#
感谢我的老板,他发明了它,我执行了可靠并发的
StackExchange.Redis
实现。这是一个检查是否已完成向RedisSet
添加项的示例场景:您需要在不同的流程中处理一批物料。当批处理完成时,您希望只有一个线程报告此完成。在这个场景中,我使用
Set
来继续添加项。一旦Set
被填充,我需要报告一次。这段代码是可靠并发的,只有1次返回
true
...没有交易。当使用Redis并发时,人们可能会尝试考虑负面的场景。