2012-12-02 70 views
0

也許這是一個代碼審查的問題,但我認爲這是最適合在這裏。讓我知道它是否需要移動。如何從Redis獲取所有數據或加速呼叫?

我將Redis用作Sinatra應用程序中某些數據的長期緩存。我遍歷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的所有數據放入對象中,因此我不必在迭代的每一步中調用它?

+0

你能不只是緩存你是從哪個緩存? –

+0

由於應用程序的範圍,似乎有點過分,但我可能只需要走這條路。 – cmhobbs

+3

你應該看看這個如果你還沒有:http://stackoverflow.com/questions/10155398/getting-multiple-key-values-from-redis –

回答

0

你應該看看@peterpan提到的答案。特別是,mget應該做的伎倆:

dkeys = redis.keys.delete_if {|e| e == "last_run"} 
@delayed = redis.mget(dkeys).map {|s| JSON.parse(s)} 
+0

這一個運行速度快得多(完成超過1秒)並在那裏讓我達到90%。 @彼得潘的評論也非常有幫助。 – cmhobbs

+0

好聽 - 我現在看到你實際上想要一個帶有key =>(JSON解析)值的地圖。我對Ruby並不熟悉,對此表示遺憾,但很高興答案很有幫助! –

+0

是的,我現在正在使用Array#zip將mangle和Hash合併在一起,並取得了一些成功。無論如何,答案工作得很好。 – cmhobbs