iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何高效地向Redis插入大量的数据(推荐)
  • 164
分享到

如何高效地向Redis插入大量的数据(推荐)

高效数据Redis 2022-06-04 17:06:39 164人浏览 安东尼
摘要

最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中。 我刚开始的建议是shell+redis客户端。 今天,查看Redis官档,发现文档的首页部分(Ht

最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中。

我刚开始的建议是shell+redis客户端。

今天,查看Redis官档,发现文档的首页部分(Http://www.redis.io/documentation)有一个专门的主题是讲述“Redis Mass Insertion”的,才知道自己的建议很low。

官方给出的理由如下:

Using a nORMal Redis client to perform mass insertion is not a Good idea for a few reasons: the naive approach of sending one command after the other is slow because you have to pay for the round trip time for every command. It is possible to use pipelining, but for mass insertion of many records you need to write new commands while you read replies at the same time to make sure you are inserting as fast as possible.

Only a small percentage of clients support non-blocking I/O, and not all the clients are able to parse the replies in an efficient way in order to maximize throughput. For all this reasons the preferred way to mass import data into Redis is to generate a text file containing the Redis protocol, in raw format, in order to call the commands needed to insert the required data.

大意是:

1> 每个redis客户端命令之间有往返时延。

2> 只要一部分客户端支持非阻塞I/O。

个人理解是,redis命令从执行到结果返回,有一定的时延,即便采用多个redis客户单并发插入,也很难提高吞吐量,因为,只有非阻塞I/O只能针对有限个连接操作。

那么如何高效的插入呢?

官方在2.6版本推出了一个新的功能-pipe mode,即将支持Redis协议的文本文件直接通过pipe导入到服务端。

说来拗口,具体实现步骤如下:

1. 新建一个文本文件,包含redis命令


SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN

如果有了原始数据,其实构造这个文件并不难,譬如shell,python都可以

2. 将这些命令转化成Redis Protocol。

因为Redis管道功能支持的是Redis Protocol,而不是直接的Redis命令。

如何转化,可参考后面的脚本。

3. 利用管道插入


cat data.txt | redis-cli --pipe

Shell VS Redis pipe

下面通过测试来具体看看Shell批量导入和Redis pipe之间的效率。

测试思路:分别通过shell脚本和Redis pipe向数据库中插入10万相同数据,查看各自所花费的时间。

Shell

脚本如下:


#!/bin/bash
for ((i=0;i<100000;i++))
do
echo -en "helloworld" | redis-cli -x set name$i >>redis.log
done

每次插入的值都是helloworld,但键不同,name0,name1...name99999。

Redis pipe

Redis pipe会稍微麻烦一点

1> 首先构造redis命令的文本文件

在这里,我选用了Python


#!/usr/bin/python
for i in range(100000):
  print 'set name'+str(i),'helloworld'

# python 1.py > redis_commands.txt

# head -2 redis_commands.txt


set name0 helloworld
set name1 helloworld

2> 将这些命令转化成Redis Protocol

在这里,我利用了GitHub上一个shell脚本,


#!/bin/bash

while read CMD; do
 # each command begins with *{number arguments in command}rn
 XS=($CMD); printf "*${#XS[@]}rn"
 # for each argument, we append ${length}rn{argument}rn
 for X in $CMD; do printf "$${#X}rn$Xrn"; done
done < redis_commands.txt

# sh 20.sh > redis_data.txt

# head -7 redis_data.txt


*3
$3
set
$5
name0
$10
helloworld

至此,数据构造完毕。

测试结果

如下:
查看图片

时间消耗完全不是一个量级的。

最后,来看看pipe的实现原理,

redis-cli --pipe tries to send data as fast as possible to the server. At the same time it reads data when available, trying to parse it. Once there is no more data to read from stdin, it sends a special ECHO command with a random 20 bytes string: we are sure this is the latest command sent, and we are sure we can match the reply checking if we receive the same 20 bytes as a bulk reply. Once this special final command is sent, the code receiving replies starts to match replies with this 20 bytes. When the matching reply is reached it can exit with success.

即它会尽可能快的将数据发送到Redis服务端,并尽可能快的读取并解析数据文件中的内容,一旦数据文件中的内容读取完了,它会发送一个带有20个字节的字符串的echo命令,Redis服务端即根据此命令来确认数据已插入完毕。

总结

后续有童鞋好奇,构造redis命令的时间和将命令转化为protocol的时间,这里一并贴下:


[root@Mysql-server1 ~]# time python 1.py > redis_commands.txt

real  0m0.110s
user  0m0.070s
sys  0m0.040s
[root@mysql-server1 ~]# time sh 20.sh > redis_data.txt

real  0m7.112s
user  0m5.861s
sys  0m1.255s

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

您可能感兴趣的文档:

--结束END--

本文标题: 如何高效地向Redis插入大量的数据(推荐)

本文链接: https://www.lsjlt.com/news/11942.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql如何高效导入大批量数据
    要高效导入大批量数据到MySQL中,可以使用以下方法: 使用LOAD DATA INFILE语句:这是MySQL提供的一个高效的...
    99+
    2024-05-13
    mysql
  • MyBatis如何批量插入大量数据
    这篇文章将为大家详细讲解有关MyBatis如何批量插入大量数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBa...
    99+
    2023-06-22
  • Windows下的PHP如何高效地处理大量数据?
    在今天的信息时代,数据处理已经成为了企业和个人必不可少的一项任务。而作为广泛使用的编程语言之一,PHP在数据处理方面也有着非常不错的表现。但是,当我们需要处理大量的数据时,如何让PHP在Windows下高效地处理数据呢?本文将会为您介绍一些...
    99+
    2023-09-29
    load 大数据 windows
  • Mysql百万量级数据如何高效导入Redis
    Mysql百万量级数据如何高效导入Redis,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着系统的运行,数据量变得越来越大,...
    99+
    2024-04-02
  • Redis:高效处理大数据量的利器
    Redis(Remote Dictionary Server)是一个开源的高性能键值对存储系统,广泛用于解决大数据量下的高并发读写问题。它支持多种数据结构,如字符串、列表、哈希、集合、有序集合等,并且提供了丰富的命令和功能,使其成为了很多互...
    99+
    2023-11-07
    Redis (字) 高效 (字) 大数据量 (字)
  • Java数组处理:如何高效地加载大量数据?
    在Java编程中,处理大量数据是一个常见的需求。然而,对于大型数据集,加载数据可能会变得非常耗时,这对程序的性能和响应时间产生负面影响。那么,如何在Java中高效地加载大量数据呢?本文将介绍一些有效的方法和技巧。 使用缓冲区 Java...
    99+
    2023-06-26
    load 大数据 数组
  • Java 大数据教程:如何利用数组高效地处理大量数据?
    随着数据量的增长,如何高效地处理大量数据成为了一项重要的技能。在 Java 中,数组是一种非常强大的数据结构,可以帮助我们高效地处理大量数据。本文将介绍如何利用数组来处理大量数据。 一、什么是数组? 数组是一种存储相同类型数据的集合,每个...
    99+
    2023-06-29
    大数据 教程 数组
  • PHP7中的生成器:如何高效地处理大量数据?
    PHP7 中引入的生成器(Generator)是一种用于高效处理大量数据的强大工具。生成器不仅可以提升程序性能,而且可以减少内存消耗,使得处理大型数据集变得更加简单和高效。本文将介绍生成器的基本概念、用法和一些具体的代码示例。一、生成器的基...
    99+
    2023-10-22
    生成器 PHP 大量数据处理
  • 如何在 Python 中高效地处理大量的日志数据?
    在现代互联网时代,日志数据已经成为了一个非常重要的组成部分。无论是网站访问日志、服务器运行日志,还是应用程序日志,都包含着宝贵的信息,可以帮助我们了解用户行为、优化系统性能等。然而,对于大规模的日志数据,如何高效地进行处理,是一个具有挑战性...
    99+
    2023-10-20
    索引 日志 面试
  • 如何用mybatis快速插入大量数据?
    在公司业务开发过程中,经常会遇到需要往数据库表中插入大量数据的一个场景,如excel批量导入数据,如何快速的去插入数据呢,可以考虑使用批量插入(实测每秒能达到35000条,后附具体代码) JDBC实现方式: 用一个 for 循环,把数据一...
    99+
    2023-09-25
    mybatis java spring boot mysql
  • PHP如何在Windows系统下高效地加载大数据量?
    PHP作为一种常用的开发语言,经常需要处理大量的数据。在Windows系统下,如何高效地加载大数据量是一个值得探讨的问题。下面将介绍几种提高PHP在Windows系统下加载大数据量效率的方法。 一、使用扩展 PHP提供了一些扩展,如APC、...
    99+
    2023-09-29
    load 大数据 windows
  • 如何提高大数据量分页的效率
    这篇文章主要讲解了“如何提高大数据量分页的效率”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何提高大数据量分页的效率”吧! ...
    99+
    2024-04-02
  • Java中如何高效地加载大数据数组?
    在Java编程中,经常会遇到需要加载大量数据的情况,比如读取文件、处理图像、解析大型数据集等。在这些场景下,如果不采取有效的方法,就会遇到内存不足、运行速度慢等问题。因此,本文将介绍Java中如何高效地加载大数据数组。 使用缓存 在J...
    99+
    2023-06-26
    load 大数据 数组
  • 如何使用Java和Bash的重定向来更高效地处理大数据?
    随着大数据时代的到来,数据处理变得越来越重要。在这个过程中,使用Java和Bash的重定向技术可以帮助我们更高效地处理大数据。本文将介绍如何使用Java和Bash的重定向来更高效地处理大数据。 一、Java的重定向 Java的重定向功能可以...
    99+
    2023-10-22
    bash 大数据 重定向
  • MySQL大量脏数据如何只保留最新的一条(最新推荐)
    因为系统的一个Bug,导致数据库表中出现重复数据,需要做的是删除重复数据且只保留最新的一条数据。 具体场景是这样的 有张订单关联额外费用表,而且一个订单号(order_no)记录只能...
    99+
    2023-05-16
    MySQL保留最新的一条 Mysql删除数据
  • PHP7中的生成器:如何高效地处理大量数据和提高代码执行效率?
    PHP7中的生成器:如何高效地处理大量数据和提高代码执行效率?随着互联网的快速发展和数据量的不断增长,处理大量数据成为了现代编程中的一个重要挑战。在PHP7中,引入了生成器(Generator)作为一种高效处理大量数据的机制。本文将介绍生成...
    99+
    2023-10-27
    生成器 效率 大量数据
  • 大数据重定向与 Python:如何提高数据处理效率?
    随着大数据时代的到来,数据处理变得越来越重要,然而,随着数据量的增加,数据处理效率也成为了一个问题。在这个问题上,Python 和重定向技术有着非常重要的作用。在本篇文章中,我们将会深入探讨大数据重定向与 Python 的结合,以及如何提高...
    99+
    2023-10-17
    大数据 重定向 load
  • 数据库中如何实现大量数据快速插入方法
    这篇文章将为大家详细讲解有关数据库中如何实现大量数据快速插入方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1     ...
    99+
    2024-04-02
  • Python 重定向技巧:如何有效地加载大数据?
    在日常的数据处理中,我们常常需要加载大数据集。但是,当数据集过大时,很容易导致程序内存溢出,从而无法正常加载数据。为了解决这个问题,我们需要掌握一些 Python 重定向技巧,以便能够更加高效地加载大数据集。 使用生成器 生成器是一种...
    99+
    2023-10-18
    大数据 重定向 load
  • PHP开发中如何高效处理大量数据
    在PHP开发中,处理大量数据是一个常见的需求,例如读取大型数据库、处理大文件、批量操作等。在处理大量数据时,我们需要考虑性能和效率,以确保系统的稳定和快速响应。本文将介绍一些在PHP中高效处理大量数据的方法,并提供具体的代码示例。一、使用合...
    99+
    2023-10-21
    数据处理 PHP开发 大量数据处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作