2

ServiceStack Redisクライアントを使用して、非常に一般的なキャッシュシナリオを実装しようとしていますが、この良い例を見つけるのに苦労しています。

ASP.NET MVCアプリでは、外部Webサービスに対して比較的長時間実行される(および従量制の)呼び出しを行い、一定期間結果をキャッシュします。キャッシュの実装では、追加の(高価な)呼び出しを回避するために、Webサービスの呼び出しが完了するまでそのキーに対する追加の要求をブロックすることが望まれます。

では、キーレベルのロックを実装するための最良の方法は何ですか?Redisはこれをすぐにサポートしますか?ServiceStackのIRedisClient.AcquireLockはこれに適していますか、それとも分散ロックを扱っていない場合はやり過ぎですか?それとも、ここで説明するように、自分でロックを実装するのが最善でしょうか?

前もって感謝します!

4

3 に答える 3

2

Redisは非ブロッキング非同期サーバーであり、キーが解放されるまでクライアント接続でブロックするためのredisに組み込まれたセマンティクスはありません。

注:RedisはリモートのNoSQLデータストアであるため、redisに関連して実装するロックは、設計上「分散」されています。ServiceStackのAcquireLockは、redisの基本的なSETNXロックセマンティクスを使用して、1つのクライアント接続のみがロックされ、他のすべてのクライアント/接続は、指数バックオフ乗数を使用してポーリングによってロックが解放されるまでブロックされたままになります。

ポーリングせずに分散ロックを実装するには、SETNX+redisのPub/Subサポートの組み合わせを使用して、待機中のクライアントにロックが解放されたことを通知するソリューションを作成する必要があります。

于 2013-01-18T02:44:55.847 に答える
2

Redisをグローバルネットワークミューテックスとして使用するには、次のパターンを使用します。

  1. ミューテックスを作成するためのLPUSH
  2. ロックするBRPOP(これはブロック中です)
  3. ロックを解除するLPUSH
于 2013-11-24T23:26:01.263 に答える
0

ロックしたいキーにSETNXを発行してみませんか?キーを設定/ロックできる場合、これは1を返します。また、すでに存在しているためにロックを取得できない場合は0。特定の情報については、 http://www.redis.io/commands/setnxを参照してください。

于 2013-01-17T21:04:18.290 に答える