【问题标题】:How to get all data from Redis or speed up calls?如何从 Redis 获取所有数据或加快调用速度?
【发布时间】:2012-12-03 18:01:12
【问题描述】:

也许这是一个代码审查问题,但我认为它最适合这里。让我知道是否需要移动。

我使用 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 提取到一个对象中,这样我就不必在迭代的每一步都调用它?

【问题讨论】:

  • 你不能只缓存你从每个中得到的东西吗?
  • 考虑到应用程序的范围,这似乎有点笨拙,但我可能不得不走那条路。
  • 如果你还没有,你应该看看这个:stackoverflow.com/questions/10155398/…

标签: ruby redis


【解决方案1】:

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

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

【讨论】:

  • 这个跑得快得多(在 1 秒多一点内完成),让我 90% 到达那里。 @peterpan 的评论也非常有帮助。
  • 很高兴听到 - 我现在知道您实际上想要一个带有 key =>(JSON 解析)值的地图。我对 Ruby 不太熟悉,对此感到抱歉,但很高兴答案有帮助!
  • 是的,我现在正在使用 Array#zip 将哈希组合在一起并取得了一些成功。无论如何,答案效果很好。
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 2020-12-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2014-06-16
  • 2021-02-09
相关资源
最近更新 更多