Redis大量插入远程服务器

时间:2017-05-17 19:03:23

标签: redis webdis

我有一台运行Redis的远程服务器,我希望从Java应用程序中推送大量数据。到目前为止,我使用Webdis在一个效率不高的时候推送一个命令,但我没有任何安全问题,因为我可以定义被接受为连接和cumand授权的IP,而redis不接受来自外部的请求(保护模式) )。

我想尝试使用jedis(Java API)和管道实现来加快插入速度,但这意味着我必须打开我的Redis才能接受来自外部的请求。

我的问题是:是否可以以类似的方式使用webdis(pipilined mass insertion)?如果没有,我需要通过互联网使用Jedis这样的安全配置是什么?

提前感谢您的回答

2 个答案:

答案 0 :(得分:1)

IMO它应该对Redis驱动程序透明如何设置安全性。任何驱动程序或密码保护都不会像专门设计的协议或技术那样安全。

以最简单的方式处理安全性,让Redis监听import csv import random csvfile = open('csvTest.csv', 'a') data = [] for x in range(5): data.append([str(random.randint(0, 100))]) writer = csv.writer(csvfile, lineterminator = '\n') writer.writerows(data) csvfile.close() 并使用SSH隧道连接到机器。至少通过这种方式,您可以在当前场景中再次测试性能。

之后您还可以使用IPSec或OpenVPN来组织能够与Redis服务器通信的专用网络。

答案 1 :(得分:1)

这个问题已经问了将近 4 年了,所以我希望它的作者现在已经有所进展,但如果其他人有同样的问题,我想我可能会建议一种更有效地将数据发送到 Webdis 的方法。< /p>

您确实可以通过批量插入来加快数据摄取速度,这意味着您可以使用 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 基准测试不仅仅是查看平均值(延迟分布仍然很重要,等等),但此示例仅展示了批处理可以产生的差异。

您可以通过以下三种方式之一 (documented here) 向 Webdis 发送命令:

  1. GET /COMMAND/arg0/.../argN
  2. POST / 在 HTTP 正文中带有 COMMAND/arg0/.../argN(如下所示)
  3. PUT /COMMAND/arg0.../argN-1 在 HTTP 正文中带有 argN

如果不是为每个请求插入一个键,而是创建一个包含 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的作者)