如何从Redis获取所有数据或加快通话速度?

时间:2012-12-02 05:23:15

标签: ruby 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中的所有数据都拉到一个对象中,所以我不必在迭代的每一步都调用它?

1 个答案:

答案 0 :(得分:0)

你应该看看@peterpan所指的答案。特别是,mget应该可以解决问题:

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