0

c#で、サービススタックのredisを使って、以下のURLをもとに、

https://github.com/ServiceStack/ServiceStack.Redis/wiki/RedisLocks

文字列エントリをロックするには、次のメソッドが使用されます。

RedisClient objRedisClient = new RedisClient... // redis working fine
objRedisClient.SetEntry("stringkey", "abcd");
using (objRedisClient.AcquireLock(strRedisKey))
{
  objRedisClient.SetEntry("stringkey", "efdh");
}

上記の SetEntry コードは、文字列値を設定するために正常に機能します。しかし、同じコードを使用してリストをロックすると、Redis Exception がスローされます。

  using (objRedisClient.AcquireLock("listkey"))
  {
      objRedisClient.Lists["listkey"].Push("{}");
  }

Acquirelock メソッドは正常に動作しますが、新しい値を using ステートメント内のリストにプッシュすると、次の例外がスローされます。

間違った種類の値を保持するキーに対する WRONGTYPE 操作、sPort: 50371、LastCommand: RPUSH 97:Q {}

これは単純なコンソール アプリケーションです。取得ロック メソッドがないと、値がリストに正常に追加されます。

c#でredisリストをロックするには?

4

2 に答える 2

1

ロック部分全体が分散ロック用であり、背後でSETNXコマンドを使用しています (アルゴリズムはコマンド ページでも説明されています)。このコマンドは、通常のキーのみを対象とし、他のタイプ (リスト、ハッシュなど) を対象としません。ロックは異なるプロセス間の同期に使用されるため、通常のキー以外を使用しても意味がありません。

確認したい場合は、 a を開いてredis-cli monitor、クライアントが Redis に送信しているコマンドが何であるかを正確に確認してください ( a である必要がありますSETNX)。

于 2015-09-24T14:47:50.123 に答える
1

ロックのキーは、保護しようとしているデータ構造のキーではなく、ロックを識別するために使用される通常のSTRINGキーです。たとえば、キー名を通常の STRING キーの名前空間として使用できます。

using (objRedisClient.AcquireLock("listkey.lock"))
{
    objRedisClient.Lists["listkey"].Push("{}");
}
于 2015-09-24T18:16:30.673 に答える