我们有一个巨大的Redis数据库,其中包含大约1亿个密钥,用于将电话号码映射到数据哈希值。
偶尔所有这些数据都需要聚合并保存到SQL数据库中。在聚合期间,我们需要遍历所有存储的密钥,并查看这些数组。
使用Redis.keys
不是一个好选择,因为它将检索并将整个密钥列表存储在内存中,并且需要很长的时间才能完成。我们需要能够返回一个可用于迭代所有键的枚举器,如下所示:
redis.keys_each { |k| agg(k, redis.hgetall(k)) }
Redis可以实现这一点吗?
这会阻止Ruby在内存中构建一个包含1亿个元素的数组,并且可能会更快。分析告诉我们使用Redis.keys
命令使Ruby占用100%的CPU,但Redis进程似乎处于空闲状态。
我知道不建议使用密钥来防止从密钥构建集合,但即使我们构造密钥集合并使用smembers检索它,我们也会遇到同样的问题。
答案 0 :(得分:4)
使用当前的Redis版本无法对所有键进行增量枚举。
您可以直接转储数据库(bgsave)并将生成的转储转换为json文件,而不是尝试提取实时Redis实例的所有键,而是使用您想要的任何Ruby工具进行处理。
请参阅https://github.com/sripathikrishnan/redis-rdb-tools
或者,您可以使用redis-rdb-tools API直接在Python中编写解析器并提取所需的数据(不生成json文件)。