我有一台运行Redis的远程服务器,我希望从Java应用程序中推送大量数据。到目前为止,我使用Webdis在一个效率不高的时候推送一个命令,但我没有任何安全问题,因为我可以定义被接受为连接和cumand授权的IP,而redis不接受来自外部的请求(保护模式) )。
我想尝试使用jedis(Java API)和管道实现来加快插入速度,但这意味着我必须打开我的Redis才能接受来自外部的请求。
我的问题是:是否可以以类似的方式使用webdis(pipilined mass insertion)?如果没有,我需要通过互联网使用Jedis这样的安全配置是什么?
提前感谢您的回答
答案 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 发送命令:
GET /COMMAND/arg0/.../argN
POST /
在 HTTP 正文中带有 COMMAND/arg0/.../argN
(如下所示)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的作者)