在Redis中存储大字符串的最佳方法...获取混合信号

时间:2014-06-20 04:36:20

标签: python redis

我正在存储大约150M的字符串。它远远低于Redis中字符串的最大大小,但我看到了很多不同的,矛盾的意见,我应该采取的方法,并没有明确的路径。

一方面,我已经看到我应该使用带有小数据块的哈希,另一方面,我被告知会导致间隙,并且存储整个字符串是最有效的。 / p>

一方面,我已经看到我可以传入一个大字符串,或者做一堆 string-append 操作来构建它。后者似乎可能比前者更有效率。

我正在从其他地方读取数据,所以我宁愿不填写本地物理文件,以便我可以传递整个字符串。显然,如果我可以将输入数据分块,并且通过附加提供到 Redis中,那么它会更好。但是,如果使用Redis无效,则可能需要永久地提供所有数据,一次一个块。我会尝试一下,但我缺乏经验,而且由于各种原因可能效率低下。

话虽如此,有很多关于“小”字符串和“大字符串”的讨论,但目前尚不清楚Redis认为最佳的“小”字符串。 512K,1M,8M?

有没有人有任何明确的评论?

如果我可以为 redis-py 提供类似文件的对象或生成器,我会喜欢它,但这比我的意思更具有语言特性,而且很可能是不可能的对于协议,无论如何:它只需要内部数据块,无论如何,当把它强加给开发者时可能会更好。

1 个答案:

答案 0 :(得分:2)

一种选择是:

将数据存储为块的长列表

  • 将数据存储在List中 - 这允许将内容存储为块的序列以及一步扫描整个列表
  • 使用pipeline contenxt管理器存储数据,以确保您是唯一一个在此刻写作的人。
  • 请注意,Redis始终处理单个请求,而其他所有请求都被阻止。对于需要时间写入的大型文件,您不仅可以减慢其他客户端的速度,还可能超过最大执行时间(请参阅此值的配置)。

使用已知指针

将数据存储在随机命名的列表中

替代方法,也使用list,将发明随机列表名称,按块将内容块写入其中,并在完成后,更新Redis中已知密钥中的值,指向此随机命名列表。不要忘记删除旧的,这可以通过您的代码完成,但如果它似乎在您的用例中可用,您可能会使用到期。