如何高效地向Redis写入大量的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何高效地向Redis写入大量的数据相关的知识,希望对你有一定的参考价值。

具体实现步骤如下:
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\\r\\n
XS=($CMD); printf "*$#XS[@]\\r\\n"
# for each argument, we append $length\\r\\nargument\\r\\n
for X in $CMD; do printf "\\$$#X\\r\\n$X\\r\\n"; done
done < redis_commands.txt
# sh 20.sh > redis_data.txt
# head -7 redis_data.txt
*3
$3
set
$5
name0
$10
helloworld
至此,数据构造完毕。
测试结果
参考技术A

    优化服务器配置,一些配置参数对写入性能影响很大,如appendfsync、slave的数量。

    使用多个客户端连接并发写入。

Hbase 客户端批量写入数据

参考技术A org.apache.hadoop.hbase.client.BufferedMutator主要用来对HBase的单个表进行操作。它和Put类的作用差不多,但是主要用来实现批量的异步写操作。
可以从Connection的实例中获取BufferedMutator的实例。在使用完成后需要调用close()方法关闭连接。对BufferedMutator进行配置需要通过BufferedMutatorParams完成。
BufferedMutator接收发送来的Put数据后,会根据某些因素(比如接收的Put数据的总量)启发式地执行Batch Put操作,且会异步的提交Batch Put请求。
BufferedMutator也可以用在一些特殊的情况上。多线程作业的每个线程将会拥有一个独立的BufferedMutator对象。
一个独立的BufferedMutator也可以用在大容量的在线系统上来执行批量Put操作,但是这时需要注意一些极端情况比如JVM异常或机器故障,此时有可能造成数据丢失。
官方源码路径: https://github.com/apache/hbase/blob/master/hbase-examples/src/main/java/org/apache/hadoop/hbase/client/example/BufferedMutatorExample.java

以上是关于如何高效地向Redis写入大量的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何高效地向Redis写入大量的数据

如何使用 Ansible 官方模块更高效地向 VMware VM 主机添加磁盘?

Redis如何高效实现点赞取消点赞功能

Redis如何高效实现点赞取消点赞功能

如何应对网站反爬虫策略?如何高效地爬大量数据

如何高效地对大量数据进行分区? [关闭]