2017-10-03 6 views
2
  • 私は現在awscに自動拡張機能を持っていますので、7から12のサービスを実行できます。 cache_client.Set<T>(generate_key<T>(key), values, TimeSpan.FromSeconds(ttl.Value));

    私はRedisLocks(ServiceStack.Redis)を使用する必要があります

  • は私がやっているキャッシュエントリを取得するには:私のクライアントマネージャーの場合

  • は、私は私がやっているキャッシュエントリを設定する
  • redis.GetCacheClient();をやっている私のクライアントのためにbuilder.register<IRedisClientsManager>(c => new PooledRedisClientManager(conection));

  • をしています: using (var read_only_client = this.redis.GetReadOnlyClient()) { return read_only_client.GetValue(generate_key<T>(key)); }

ISSUE =>私は、無効なキャッシュ値不正な形式のJSONと見当違いのテキストを取得しています。

質問=>キャッシュの値を設定または取得する前にRedisのロックを使用する必要があるため、無効なキャッシュの値が表示されます。

答えて

1

カスタム分散ロックを実装するためのRedisLockを使用することはめったにありません。すべてのRedis操作はアトミックであり、複数の操作をアトミックに送信する必要がある場合は、Redis Transactionsを使用するか、LUAスクリプトを実装できます。

完全な例外の詳細や破損したデータは表示されませんが、問題は複数のスレッドにわたって同じRedis Clientインスタンスを再利用する可能性が最も高いです。 IRedisClientsManagerはThreadSafeであり、シングルトンとして登録する必要がありますが、返されるクライアントインスタンスはThreadSafeではなく、複数のスレッド間で共有したり、シングルトンとして使用したり、静的変数に格納したりしないでください。 各スレッドそれは彼らがそれらを解決する必要があります使用し、

using (var redis = redisManager.GetClient()) 
{ 
    //... 
} 

Redis Client and Cache Registration Example

あなたは例えば、シングルトンとしてIRedisClientsManagerICacheClientの両方を登録する必要があります。

container.Register<IRedisClientsManager>(c => 
    new RedisManagerPool(connection)); 

container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient()); 

Redis ICacheClientがThreadSafeである場合、問題は複数のスレッドにわたって同じRedis Instanceを使用しているコードの別の領域にあります。 Redisのすべての使用法を慎重に確認して、各Redis Clientが適切に処理され、異なるスレッド間で共有されていないことを確認してください。

ライブラリを適切に使用しても問題が解決しない場合は、問題を確認するために実行できるスタンドアロンのサンプルプロジェクト(GitHubなど)をまとめて確認し、確認します。

+0

私が考えることができるのは、シングルトンとしてICacheClientを登録していないことだけです。私はredis.GetCacheClient()をやっています。私のクラスのコンストラクタで(クラスは静的ではありません)。しかし、それは問題ではないはずですか? 私はいつもそこに読み取りを除いてICacheClientを使用するが、私は(VAR read_only_client = this.redis.GetReadOnlyClient()){ リターンread_only_client.GetValue(GENERATE_KEY (キー))を使用して、使用して でそれをラップしています。 } –

+0

私が見た別のことは、私は2つのレジスタを自分のキャッシュと別の1つのRedisMQServerと異なる接続文字列で持っていることです。それは問題になる可能性がありますか? @mythz var redis_factory = new PooledRedisClientManager(queue_connection);ビルダー 。を登録します(c => redis_factory)。 builder.register (c =>新しいRedisMqServer(redis_factory)); ... then builder.Register (c => new PooledRedisClientManager(cache_connection)); –

+0

Redis ICacheClientを登録しても問題はありません。また、 'RedisMqServer'を含むすべてのものに対して同じ' PooledRedisClientManager'インスタンスを使用する必要があります。問題を特定する最善の方法は、問題を再現するために実行できる小さな独立型プロジェクトをまとめることです。 – mythz

関連する問題