ruby - 如何从 Redis 获取所有数据或加快调用?

标签 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)> 

延迟在 map 上很明显,我认为延迟是调用 redis 1300+ 次的成本。

有没有一种方法可以将所有数据从 redis 提取到一个对象中,这样我就不必在迭代的每一步都调用它?

最佳答案

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

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

关于ruby - 如何从 Redis 获取所有数据或加快调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13666675/

相关文章:

sql - 从字符串中删除前 4 个字符

go - 错误 'zadd'命令的参数数目错误

redis - 为什么我的 redis 集群上的热点不好?

ruby-on-rails - rails bin/rails 文件如何/做什么

java - 可扩展的 ruby 应用程序

java - 关于jredis性能的问题

docker - 如何使用 Docker Compose 连接到 Redis 容器?

c# - StackExchange.Redis可以用来存储POCO吗?

ruby - 转义 URL(没有双重转义)

ruby - 如何设置测试环境(测试 gem`s + 测试数据库)