【问题标题】:Dump the whole redis database instance using hiredis使用hiredis转储整个redis数据库实例
【发布时间】:2013-06-06 14:55:23
【问题描述】:

我有一个缓冲区,需要在重新启动后从 redis 读取所有值(哈希、字段和值),有没有办法快速做到这一点?我有大约 100,000 个散列,每个散列有 4 个字段。

谢谢!

编辑: 缓慢的方式:当前的实现是使用

Keys *

然后

HGETALL xxx

获取所有字段的值。

【问题讨论】:

  • 你实现过慢的方式吗?
  • 谢谢,在我的编辑中添加了信息。

标签: redis hiredis


【解决方案1】:

有两种方法可以解决这个问题。

第一个是尝试优化您描述的 KEYS/HGETALL 组合。因为您没有数百万个键(Redis 标准中 100K 并没有那么高),所以 KEYS 命令不会长时间阻塞实例,返回 100K 项所需的输出缓冲区大小可能是可以接受的。一旦您的程序接收到密钥列表,接下来的挑战就是尽可能快地运行许多 HGETALL 命令。关键是将它们流水线化(例如以 1000 个项目的同步批次),这很容易用hiredis 实现(只需使用redisAppendCommand / redisGetReply)。仅在 100 次往返中检索 100K 项。因为大多数 Redis 实例可以维持 100K op/s 或更多,所以它的持续时间不应超过几秒钟。更有效的解决方案是使用hiredis的异步接口来尝试最大化吞吐量,但实现起来更复杂。我不确定 10 万件物品是否值得。

第二种方法是使用 BGSAVE 命令拍摄 Redis 内容的快照,检索生成的转储文件,然后解析文件以提取数据。您可以查看用于 Python 实现的出色的 redis-rdb-tools 包。这种方法的主要好处是对 Redis 实例没有影响(没有 KEYS 命令来阻止事件循环),同时仍然检索一致的数据。

【讨论】:

  • 谢谢,其实我描述的只是一个例子。我还有 100 个其他实例也在 12 核系统上运行。我将尝试第二种方法,看看它是如何执行的。你知道转储文件的任何基于 c 或 c++ 的解析器吗?谢谢!
  • 不在 c/c++ 中。我会尝试使用 Redis 代码本身来编写一个。比以前更难了,但还是可以做到的。
猜你喜欢
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2011-04-13
相关资源
最近更新 更多