1
私はjsonのシリアル化されたオブジェクトに値として格納されたcountプロパティを持っています。 2人のユーザーが同時にオブジェクトを取得し、それらを保存するときに+ 1でカウントを更新すると、カウント値が破損します。Redis同時読み込みと更新
Redisでこのシナリオを処理する正しい方法は何ですか?私は.Net用のStackexchangeクライアントを使用しています。
私はjsonのシリアル化されたオブジェクトに値として格納されたcountプロパティを持っています。 2人のユーザーが同時にオブジェクトを取得し、それらを保存するときに+ 1でカウントを更新すると、カウント値が破損します。Redis同時読み込みと更新
Redisでこのシナリオを処理する正しい方法は何ですか?私は.Net用のStackexchangeクライアントを使用しています。
一貫性を保証するトランザクションが必要です。赤字では、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を使用して、いくつかのパフォーマンス。
編集:例といくつかの説明を修正します。
また、「.... Redisは自動的にこの鍵を追跡し、ロールバックするとトランザクションが元に戻ります...」 私の目的は、両方の操作を成功させてカウントを更新することです正しい値。 – user1814491
更新された回答ありがとうございます。私はもう少し複雑なシナリオを持っています - オブジェクトには、子オブジェクトのコレクションであるプロパティがあります。それが私がjsonのシリアル化を検討していた理由です。 パフォーマンスに関する問題は認識していますが、HashSetとListに分解するのは難しいです – user1814491