我有一个缓冲区,需要在重新启动后从 redis 读取所有值(哈希、字段和值),有没有办法快速做到这一点?我有大约 100,000 个散列,每个散列有 4 个字段。
谢谢!
编辑:缓慢的方式:当前的实现正在使用所有哈希值
Keys *
然后
HGETALL xxx
获取所有字段的值。
有两种方法可以解决这个问题。
第一个是尝试优化您描述的 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 命令来阻止事件循环),同时仍然检索一致的数据。