1

したがって、redis gem はスレッドセーフであるはずです。それは良いことです。しかし、どのように設定する必要があるのか​​ 疑問に思っています。jRuby と Celluloid を使用しています (デフォルトのファイバーを使用)。

私が今それを使用している方法は、グローバルメソッドが定義されていることです:

def redis
  @_redis ||= Redis.new(...)
end

Redis クライアントのタイムアウト パラメータを 30 に設定しています。スレッド セーフの問題は発生していないと思います (スレッドを生成する前に初期化します) が、Redis::TimeoutErrorエラーが発生することがあります。これらのスレッドが接続を永遠に開いたままにして、最終的に利用可能なすべての接続を占有するのではないかと思いますか?

基本的に問題は、時々 Redis::TimeoutError が発生することです。ある時点で開いている接続を確認する方法はありますか? または、問題が何であるか考えていますか?

ありがとう

4

1 に答える 1

1

ここでの問題は、redis クライアントが排他的にロックすることです (1、2、3 などのスレッドのコマンドにかかる時間を測定することで、おそらく線形であることが確認できます)。

ここには 2 つの解決策があります。

  1. スレッドごとに新しいクライアントを作成します(開いているファイルがたくさん残り、プロセスが長時間実行されると、マシンが強制終了することに注意してください)
  2. 接続プールを実装する
  3. この宝石を接続プールとして使用します (まだテストしていません)。
于 2013-07-11T09:30:22.660 に答える