1

我希望这个列表适合询问有关 redis 客户端 "hiredis" 的问题。我想用 redis client 实现我在下面做的同样的事情。可以看出,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[][]; 我需要将每一行作为不同的记录发送,但也只需要调用一次 rpush 来提高性能。你对我有什么建议吗?

4

1 回答 1

2

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

我建议通过 n 个项目(n 在 10 到 100 之间)的小数据包来构建你的推送命令,并将你的推送命令分组到 m 个命令的管道中(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函数。

于 2013-10-01T10:35:30.150 回答