Redis并发读取和更新

use*_*491 7 .net c# redis

假设我有 json 序列化对象,其中 count 属性存储为 value 。如果两个用户同时检索对象并在将其保存回来时用 + 1 更新计数,则计数值将被损坏。

使用 Redis 处理这种情况的正确方法是什么?我正在使用 .Net 的 Stackexchange 客户端。

nos*_*ame 6

您需要事务来保证一致性。在redis中,可以使用multi命令来完成。

使用 Stackexchange,可以像这样完成(示例改编自他们的文档

IDatabase db = redis.GetDatabase();
// Using transaction will lock "mykey" entry, so that all operation on this key are consistent. 
// All other clients attempting to manipulate this key, will have to wait for the end of transaction.
var tran = db.CreateTransaction(); 
string json = tran.StringGet("mykey");
// here, you should deserialize json, increment count value and serialize it back to string
string updated = handle_value(json);
tran.StringSet("mykey");
tran.Execute();
Run Code Online (Sandbox Code Playgroud)

请注意,序列化和反序列化 json 的成本可能很高,您可以通过使用哈希来获得一些性能。

编辑:修复示例和一些解释。