【问题标题】:Redis mass insertions on remote server远程服务器上的 Redis 批量插入
【发布时间】:2017-05-17 19:03:22
【问题描述】:

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

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

我的问题是:是否可以以类似的方式使用 webdis(pipillined 大规模插入)?如果不是,我需要进行哪些安全配置才能在互联网上使用 Jedis 之类的东西?

提前感谢您的任何回答

【问题讨论】:

标签: redis webdis


【解决方案1】:

IMO 它应该对 Redis 驱动程序是透明的,您如何设置安全性。没有任何驱动程序或密码保护比专门设计的协议或技术更安全。

我处理安全性的最简单方法是让 Redis 监听 127.0.0.1:<some port> 并使用 SSH 隧道连接机器。至少通过这种方式,您可以根据当前场景测试性能。

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

【讨论】:

    【解决方案2】:

    这个问题已经有将近 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):

    1. GET /COMMAND/arg0/.../argN
    2. POST /COMMAND/arg0/.../argN 在 HTTP 正文中(如下所示)
    3. PUT /COMMAND/arg0.../argN-1argN 在 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的作者)

    【讨论】:

      猜你喜欢
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2013-05-24
      • 1970-01-01
      • 2014-04-20
      • 2018-07-18
      • 2013-07-01
      相关资源
      最近更新 更多