我有一个缓冲区,需要在重启后从redis读取所有值(哈希,字段和值),有没有办法快速完成?我有大约100,000个哈希值,每个哈希值有4个字段。
谢谢!
编辑: 缓慢的方式:当前实现使用
获取所有哈希值Keys *
然后
HGETALL xxx
获取所有字段的值。
答案 0 :(得分:1)
有两种方法可以解决这个问题。
第一个是尝试优化您描述的KEYS / HGETALL组合。因为你没有数百万个密钥(Redis标准的100K不是那么高),所以KEYS命令不会长时间阻塞实例,并且返回100K项所需的输出缓冲区大小可能是可以接受的。一旦程序收到了密钥列表,那么下一个挑战是尽可能快地运行许多HGETALL命令。关键是管道它们(例如在1000个项目的同步批处理中),这很容易用hiredis实现(只需使用redisAppendCommand / redisGetReply)。 100K物品将仅在100次往返中被检索。因为大多数Redis实例可以维持100K op / s或更多,所以它不应该持续超过几秒钟。更有效的解决方案是使用hiredis的异步接口来尝试最大化吞吐量,但实现起来更复杂。我不确定100K物品是否值得。
第二种方法是使用BGSAVE命令获取Redis内容的快照,检索生成的转储文件,然后解析文件以提取数据。您可以查看Python实现的优秀redis-rdb-tools包。这种方法的主要好处是,在仍然检索一致数据时,对Redis实例(没有阻止事件循环的KEYS命令)没有影响。