2017-03-13 17 views
1

私は、複数のredis-clientがredis-serverに格納されている共通の構造にアクセスしているという問題があります。redisに格納されたデータのロック機構

  1. 特定のRedisクライアントは、(構造上の操作を読み書きをしなければならない)のRedisサーバに保存されている構造にアクセスしている場合は、他のRedisクライアントがあってはならない - :次のように

    要件がありますアクセスしてリリースを待つことができます。

  2. 他のredis-clientが構造体にアクセスするたびに、更新された構造体にアクセスする必要があります。

Cコードでこの要件を満たすロック機構をどのように配置できますか。 ありがとうございました。

1)使用Redisのトランザクションと楽観的ロック:

+1

redisトランザクション(MULTI/EXEC)で十分ですか? –

+0

@Not_a_Golfer - 私の知識はRedisに限られています。構造私はハッシュに格納しています。 以下のシーケンスはC言語で動作しますか: - MULTI - > HGET - 構造体の一部のフィールドの更新 - > HSET - > EXEC – Amrendra47

+1

トランザクションを使用して値を観察することはできません。それが必要なものなら、おそらくLuaスクリプトが良いでしょう。終了するまで原子的に実行されます。 –

答えて

1

Redisのは、以下を提供します。 Redis Transactions

を参照してください。2)またはRedisで実行されるLuaスクリプト。 EVAL

0

他のクライアントによる変更を検出するには、watchコマンドhttps://redis.io/commands/watchを使用してください。このコマンドは、redisトランザクションの指定されたキーにのみ指定されています

0

皆さん、ありがとうございます。レディスで利用可能なさまざまな機能や一般化された方法を知ることは有用でした。

しかし私はこのように私の要求が満たされたので次のように接近しました。

ハッシュ値としてキーとカウンタにsecound timestamp(たとえばt_sec)を使用しました。その特定の秒でさらに要求が来ると、t_secキーに対応するカウンタ値が原子的な方法でインクリメント(HINCRBYコマンド)されました。残りのパラメータは、ローカルに構造体に格納されます。カウンタが特定の制限値に達すると、要求は破棄されます。 これが次の秒の場合、新しいt_secキー値が使用され、カウンタはゼロから増分されます。 前の秒に対応するt_secキーが削除されました(HDELコマンド)。

関連する問題