redis质量增量更新

时间:2014-09-15 04:22:49

标签: java performance redis

我在redis数据库中有大约10,000,000条记录。我收到了一个包含大约100,000个字符串的圆柱CSV文件,这些字符串与我的redis数据库中的密钥相对应。对于CSV中的每个字符串,我需要将redis中的值递增1。通常使用增量INCR命令,但有没有办法可以比创建迭代100,000次的循环更快,并逐个发送INCR命令来单独更改每个键值?是否有更大规模的更新方式?

2 个答案:

答案 0 :(得分:1)

首先,每个redis驱动程序都有“Pipeline”来执行批处理命令。您不需要逐个发送incr命令,而是将它们一起发送到redis服务器。

其次,如果100,000个字符串中有重复的键,请使用“INCRBY”命令。例如,doc是“k1,1; k2,2; k1,3”,那么你可以使用“INCRBY k1 2”代替2“INCR k1”

答案 1 :(得分:0)

注意:以下是纯粹的推测,需要进行测试验证:)

@ Mark_H的回答是教科书(+1),但我有一个疯狂的想法,你可以测试你是否想要。假设(并且这是一个很大的假设)你的10M左右的密钥是可序列化的,并且给定了序列中密钥的位置,你可以得出相关密钥的名称(例如,如果名称是基于a连续数字标识符)如何准备一个位串并让设置位指示增量操作?

这样的位值大小约为1.2MB,但另一种方法是发送100K操作(流水线或不流水线),这样可以提高网络效率。性能如何?这个想法的下一部分是编写一个实际接受此值的小Lua,并为相关键执行INCR。我怀疑它会表现得同样如果不是更好。

如果您尝试此操作,请及时通知我们;)

P.S。在我的回答中另一个隐藏的假设是你只是添加了1,但是可以通过重复其他数字/附加键的方法来解决这个问题。