我在一个红宝石数据库里有大约一千万条记录。我收到了一个列式CSV文件,其中包含大约100000个字符串,这些字符串对应于我的redis数据库中的键。对于CSV中的每个字符串,我需要将redis中的值增加一个。通常使用INCR命令来增加,但是有什么方法比创建循环更快吗?循环迭代100,000次,然后逐个发送INCR命令,以单独更改每个键值吗?是否有更大规模的更新方式?
发布于 2014-09-15 05:56:39
首先,每个redis驱动程序都有执行批处理命令的“管道”。您不需要一个一个地发送incr命令,而是将它们一起发送到redis服务器。
其次,如果您的100000个字符串中有重复的键,请使用"INCRBY“命令。例如,doc是" k1 ,1;k2,2;k1,3",那么您可以使用"INCRBY k1 2“而不是2 "INCR k1”。
发布于 2014-09-15 11:19:17
注:以下是纯粹的推测,需要验证测试:)
@Mark_H的答案是教科书(+1),但我有一个疯狂的想法,如果你愿意,你可以测试。假设(这是一个很大的假设)您的10米左右的键是可序列化的,并且给定一个键在序列中的位置,您可以导出相关键的名称(例如,如果名称是基于一个连续的数字标识符),那么准备一个位串并让set位指示增量操作怎么样?
这样的位值大约是1.2MB大小,但另一种方法是发送100 more (不管是否流水线),因此这是更有效的网络效率。表演怎么样?这个想法的下一部分是编写一个小Lua,它实际上接受这个值,并对相关的键执行INCR。我怀疑,如果不是更好的话,它的表现也是一样的。
(如果您尝试这样做,请随时通知我们;)
在我的回答中,另一个隐藏的假设是,你只添加1,但这可以通过重复其他数字/附加键的方法来解决。
https://stackoverflow.com/questions/25840793
复制相似问题