据说我有一个json序列化对象,其count属性存储为一个值。如果两个用户同时检索对象并在将计数保存回来时用+ 1更新计数,则计数值将被破坏。
使用Redis处理此方案的正确方法是什么?我正在使用.ex的Stackexchange客户端。
答案 0 :(得分:2)
您需要交易以保证一致性。在redis中,可以使用multi命令完成。
使用Stackexchange,可以这样做(示例改编自他们的doc)
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();
请注意,序列化和反序列化json可能很昂贵,而使用hash可以获得一些性能。
编辑:修复示例和一些解释。