使用hiredis通过一次呼叫发送多条记录

时间:2013-10-01 08:06:23

标签: c redis hiredis

我希望此列表适用于询问有关redis客户端“hiredis”的问题。 我想用redis客户端实现我在下面做的同样的事情。可以看出redis通过一次rpush调用发送3个不同的记录。

redis 127.0.0.1:6379> rpush test kemal erdem husyin

(integer) 3
redis 127.0.0.1:6379> lrange test 0 -1
1) "kemal"
2) "erdem"
3) "husyin"

在我的项目中,我使用hiredis作为例子:

reply =  (redisReply*)(redisCommand(c, "RPUSH %s %s" , channelName,  message));

但是现在我有一个大的日志文件,其中每一行都被保存在像char[][]这样的buff中; 我需要将每一行作为不同的记录发送,但也需要调用rpush一次性能。你能给我一个建议吗?

1 个答案:

答案 0 :(得分:2)

发送一个独特的命令推送超过几千个项目是一个坏主意。它会使通信缓冲区饱和,并且由于Redis的单线程特性,大型命令将阻止所有其他并发命令。

我建议通过批量n个项目的小数据包(n介于10和100之间)来构建推送命令,并将推送命令分组到pipeline个m命令(介于10和100之间)。

算法将是这样的:

While there are still lines to read:
   New Redis pipeline, i=0
   While there are still lines to read and i<m:
      Read at most n lines
      Build push command for the read lines
      Pipeline push command
      ++i
   Flush Redis pipeline, check return status if needed

它只会产生N /(n * m)往返(N是输入文件中的行数)。

要使用任意数量的参数构建命令,可以使用redisAppendCommandArgv函数。