0

これはコード レビューの質問かもしれませんが、ここが最も適していると思います。移動が必要な場合はお知らせください。

Sinatra アプリケーションの一部のデータの長期キャッシュに相当するものとして Redis を使用しています。Redis のすべてのキーを反復処理し、それらのデータを取得して、JSON で解析しています。かなり時間がかかっています。ベンチマークは次のとおりです。

[13] pry(main)> Benchmark.measure do
[13] pry(main)*   dkeys = redis.keys.delete_if {|e| e == "last_run"}  
[13] pry(main)*   @delayed = dkeys.map {|k| {k => JSON.parse(redis.get(k))}}                                                                                                         
[13] pry(main)* end  
=>   0.520000   0.160000   0.680000 (132.410716)

[14] pry(main)> @delayed.count
=> 1358
[15] pry(main)> 

遅延は明らかにマップにあり、レイテンシは redis を 1300 回以上呼び出すコストだと思います。

すべてのデータを redis からオブジェクトにプルして、反復の各ステップでそれを呼び出す必要がないようにする方法はありますか?

4

1 に答える 1

0

@peterpan が参照している回答をご覧ください。特に、mgetトリックを行う必要があります:

dkeys = redis.keys.delete_if {|e| e == "last_run"}
@delayed = redis.mget(dkeys).map {|s| JSON.parse(s)}
于 2012-12-03T10:01:12.093 に答える