这个问题已经有将近 4 年的历史了,所以我希望它的作者现在已经继续前进,但如果其他人有同样的问题,我想我可能会建议一种更有效地将数据发送到 Webdis 的方法。
您确实可以通过批量插入来加快数据摄取速度,这意味着您可以使用 MSET 在单个请求中插入多个键(或 HMSET 用于哈希等)。
例如,这里是 ApacheBench (ab) 使用 100 个客户端插入一个密钥 100,000 次:
$ ab -c 100 -n 100000 -k 'http://127.0.0.1:7379/SET/foo/bar'
[...]
Requests per second: 82235.15 [#/sec] (mean)
我们测量每秒 82,235 次单键插入。请记住,HTTP 基准测试不仅仅是查看平均值(延迟分布仍然很重要等),但这个示例只是为了展示批处理可以产生的差异。
您可以通过以下三种方式之一向 Webdis 发送命令 (documented here):
GET /COMMAND/arg0/.../argN
-
POST / 和 COMMAND/arg0/.../argN 在 HTTP 正文中(如下所示)
-
PUT /COMMAND/arg0.../argN-1 和 argN 在 HTTP 正文中
如果我们不是在每个请求中插入一个密钥,而是创建一个包含MSET 命令的文件以在单个请求中写入 100 个密钥,那么我们可以显着提高写入速率。
# first showing what the command looks like for 3 keys
$ echo -n 'MSET' ; for i in $(seq 1 3); do echo -n "/key-${i}/value-${i}"; done
MSET/key-1/value-1/key-2/value-2/key-3/value-3
# then saving the command to write 100 keys to a file:
$ (echo -n 'MSET' ; for i in $(seq 1 100); do echo -n "/key-${i}/value-${i}"; done) > batch-contents.txt
有了这个文件,我们可以使用ab把这个多插入文件作为一个POST请求(-p)发送到Webdis:
$ ab -c 100 -n 10000 -k -p ./batch-contents.txt -T 'application/x-www-form-urlencoded' 'http://127.0.0.1:7379/'
[...]
Requests per second: 18762.82 [#/sec] (mean)
这显示每秒有 18,762 个请求……每个请求执行 100 次插入,每秒总共有 1,876,282 个实际密钥插入。
如果您在 ab 运行时跟踪 Redis 的 CPU 使用率,您会发现 MSET 用例将其固定为 100% CPU,而发送单个 SET 则没有。
再次记住,这是一个粗略的基准,足以表明批量插入时存在显着差异。顺便说一句,无论是否使用 Webdis 都是如此:从直接连接到 Redis 的客户端批量插入也应该比单个插入快得多。
注意:(我是Webdis的作者)