Redis:Java链接redis单节点千万级别数据 写入,读取 性能测试
本文是对Redis 单节点,针对不同的数据类型,做插入行测试. 数据总条数为:10058624
环境说明:
Redis 未做任何优化, 单节点 (服务器上, 内存64G).
数据量 : 10058624条 (大约一千零6万条数据,本地机器运行读取插入操作.)
数据大小 : 1093.56MB (1.1G)
插入数据类型为 String 类型
Jedis插入
public void save(){
//连接本地Redis服务
Jedis jedis = new Jedis("bj-rack001-hadoop006");
InputStream fis = null;
fis = new BufferedInputStream(new FileInputStream(PATH));
//根据数据流初始化一个DBFReader实例,用来读取DBF文件信息
DBFReader reader = new DBFReader(fis);
Object[] rowValues;
int index = 0;
while ((rowValues = reader.nextRecord()) != null){
if (null != rowValues && rowValues.length > 0) {
index ++;
if (index %10000 == 0) {
long end = System.currentTimeMillis();
System.out.println("处理数据中 ==> 插入数据总条数 : "+index+" 总耗时 : "+ (end-start)/1000 + " s , 处理速度 : " +(index/((end-start)/1000))+" 条 / s");
}
jedis.set("index" + SEPARATOR +index, Array2String(rowValues));
}
}
jedis.close();
}

假设插入速度为 2800条/s , 那么插入10058624 条数据需要用时: 3593秒 . ( 59.88 min , 约 1小时. )!!!!!
Pipelining插入
public void save(){
//连接本地Redis服务
Jedis jedis = new Jedis("bj-rack001-hadoop006");
Pipeline pipelined = jedis.pipelined();
InputStream fis = null;
fis = new BufferedInputStream(new FileInputStream(PATH));
//根据数据流初始化一个DBFReader实例,用来读取DBF文件信息
DBFReader reader = new DBFReader(fis);
Object[] rowValues;
int index = 0;
while ((rowValues = reader.nextRecord()) != null){
if (null != rowValues && rowValues.length > 0) {
index ++;
if (index %10000 == 0) {
long end = System.currentTimeMillis();
System.out.println("处理数据中 ==> 插入数据总条数 : "+index+" 总耗时 : "+ (end-start)/1000 + " s , 处理速度 : " +(index/((end-start)/1000))+" 条 / s");
}
pipelined.set("index"+ SEPARATOR +index,Array2String(rowValues));
}
}
pipelined.sync();
jedis.close();
}

处理数据完成 ==> 插入数据总条数 size : 10058624 total use : 62 s , 处理速度: 162235 条/s
和传统方式相比,性能差将近58 倍!!!!!!!!
读取全部 String 类型数据
Jedis读取
public void save(){
//连接本地Redis服务
Jedis jedis = new Jedis("bj-rack001-hadoop006");
long start = System.currentTimeMillis();
int num = 10058624;
for (int index = 1; index < num; index++){
if (index %10000 == 0) {
long end = System.currentTimeMillis();
System.out.println("处理数据中 ==> 插入数据总条数 : "+index+" 总耗时 : "+ (end-start)/1000 + " s , 处理速度 : " +(index/((end-start)/1000))+" 条 / s");
}
String key = KEYPREFIX + SEPARATOR + index;
String value = jedis.get(key);
}
jedis.close();
}

假设插入速度为 5000条/s , 那么插入10058624 条数据需要用时: 2012 秒 . ( 33min 30 s . )
Pipelining读取
public void save(){
//连接本地Redis服务
Jedis jedis = new Jedis("bj-rack001-hadoop006");
Pipeline pipelined = jedis.pipelined();
long start = System.currentTimeMillis();
HashMap<String, Response<String>> intrmMap = new HashMap<String, Response<String>>();
int num = 10058624;
for (int index = 1; index < num; index++){
if (index %10000 == 0) {
long end = System.currentTimeMillis();
System.out.println("处理数据中 ==> 插入数据总条数 : "+index+" 总耗时 : "+ (end-start)/1000 + " s , 处理速度 : " +(index/((end-start)/1000))+" 条 / s");
}
String key = KEYPREFIX + SEPARATOR + index;
intrmMap.put(key, pipelined.get(key));
}
pipelined.sync();
jedis.close();
}

由于是异步操作, 所以上面的结果并不准.最终获取数据时间
batchGetUsePipeline : 处理数据完成 ==> 读取数据总条数 size : 10058623 total use : 48 s , 处理速度: 209554 条/s
和传统方式相比,性能差将近 41.92 倍!!!!!!!!
插入数据类型为 List 类型
Jedis插入
public void save(){
//连接本地Redis服务
Jedis jedis = new Jedis("bj-rack001-hadoop006");
InputStream fis = null;
fis = new BufferedInputStream(new FileInputStream(PATH));
//根据数据流初始化一个DBFReader实例,用来读取DBF文件信息
DBFReader reader = new DBFReader(fis);
Object[] rowValues;
int index = 0;
while ((rowValues = reader.nextRecord()) != null){
if (null != rowValues && rowValues.length > 0) {
index ++;
if (index %10000 == 0) {
long end = System.currentTimeMillis();
System.out.println("处理数据中 ==> 插入数据总条数 : "+index+" 总耗时 : "+ (end-start)/1000 + " s , 处理速度 : " +(index/((end-start)/1000))+" 条 / s");
}
jedis.lpush("index", JacksonUtils.toJSon(rowValues));
}
}
jedis.close();
}

假设插入速度为 2600条/s , 那么插入10058624 条数据需要用时: 3869 秒 . ( 64.5 min , 约 1小时零5分钟. )
Pipeline 插入
public void save(){
//连接本地Redis服务
Jedis jedis = new Jedis("bj-rack001-hadoop006");
Pipeline pipelined = jedis.pipelined();
InputStream fis = null;
fis = new BufferedInputStream(new FileInputStream(PATH));
//根据数据流初始化一个DBFReader实例,用来读取DBF文件信息
DBFReader reader = new DBFReader(fis);
Object[] rowValues;
int index = 0;
while ((rowValues = reader.nextRecord()) != null){
if (null != rowValues && rowValues.length > 0) {
index ++;
if (index %10000 == 0) {
long end = System.currentTimeMillis();
System.out.println("处理数据中 ==> 插入数据总条数 : "+index+" 总耗时 : "+ (end-start)/1000 + " s , 处理速度 : " +(index/((end-start)/1000))+" 条 / s");
}
pipelined.lpush("index", JacksonUtils.toJSon(rowValues));
}
}
pipelined.sync();
jedis.close();
}

处理数据完成 ==> 插入数据总条数 size : 10058624 total use : 62 s , 处理速度: 162235 条/s
和传统方式对比 性能相差 62.5倍
读取全部 List 类型数据
Jedis读取
public void save(){
//连接本地Redis服务
Jedis jedis = new Jedis("bj-rack001-hadoop006");
long start = System.currentTimeMillis();
List<String> list = jedis.lrange("index", 0, 10058624);
jedis.close();
long end = System.currentTimeMillis();
System.out.println("处理数据中 ==> 读取数据总条数 : "+list.size()+" 耗时 : "+ start + " s , 处理速度 : " +(list.size()/((end-start)/1000))+" 条 / s");
}
读取数据总条数 size : 10058624 total use : 15 s , 处理速度: 670574 条/s
Pipline读取
public void save(){
//连接本地Redis服务
Jedis jedis = new Jedis("bj-rack001-hadoop006");
long start = System.currentTimeMillis();
Pipeline pipelined = jedis.pipelined();
Response<List<String>> list = pipelined.lrange("index", 0, 10058624);
pipelined.sync();
jedis.close();
long end = System.currentTimeMillis();
System.out.println("处理数据中 ==> 读取数据总条数 : "+list.size()+" 耗时 : "+ start + " s , 处理速度 : " +(list.size()/((end-start)/1000))+" 条 / s");
}
处理数据完成 ==> 读取数据总条数 size : 10058624 total use : 12 s , 处理速度: 838218 条/s
pipline的数据读取方式确实会快很多, 但是内存存在消耗
文章转载至:https://blog.csdn.net/zhanglong_4444/article/details/87921162
Redis:Java链接redis单节点千万级别数据 写入,读取 性能测试的更多相关文章
- Redis 单节点百万级别数据 读取 性能测试.
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 这里先进行造数据,向redis中写入五百万条数据,具体方式有如下三种: 方法一:(Lua 脚本) vim ...
- Java链接Redis时出现 “ERR Client sent AUTH, but no password is set” 异常的原因及解决办法
Java链接Redis时出现 "ERR Client sent AUTH, but no password is set" 异常的原因及解决办法 [错误提示] redis.clie ...
- Java链接Redis时出现 “ERR Client sent AUTH, but no password is set”
Java链接Redis时出现 “ERR Client sent AUTH, but no password is set” 异常的原因及解决办法. [错误提示] redis.clients.jedis ...
- mysql数据库千万级别数据的查询优化和分页测试
原文地址:原创 mysql数据库千万级别数据的查询优化和分页测试作者:于堡舰 本文为本人最近利用几个小时才分析总结出的原创文章,希望大家转载,但是要注明出处 http://blog.sina.com. ...
- java之5分钟插入千万条数据
虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢.10分钟内基本能看到结果. 之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据. 线程 ...
- flink04 -----1 kafkaSource 2. kafkaSource的偏移量的存储位置 3 将kafka中的数据写入redis中去 4 将kafka中的数据写入mysql中去
1. kafkaSource 见官方文档 2. kafkaSource的偏移量的存储位置 默认存在kafka的特殊topic中,但也可以设置参数让其不存在kafka的特殊topic中 3 将k ...
- JAVA使用POI如何导出百万级别数据(转)
https://blog.csdn.net/happyljw/article/details/52809244 用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会 ...
- JAVA使用POI如何导出百万级别数据
用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...
- JAVA使用POI如何导出百万级别数据(转载)
用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...
随机推荐
- ssh判断免密登陆
ssh判断免密登陆 [root@jenkins ~]# vi /opt/release_code.sh #!/bin/bash . /etc/init.d/functions #echo $WORKS ...
- C++知识点案例 笔记-2
1.友元函数 2.友元类 3.继承(公有继承) 4.公有继承的访问权限 5.私有继承的访问权限 6.保护继承的访问权限(两次继承) ==友元函数== #include <iostream> ...
- IDEA 2019.2.4 破解安装教程
将下载的 IDEA 压缩包解压,找到 idealIU-2019.2.4.exe 安装文件,然后双击进行安装 安装完后不要运行,打开解压包中破解补丁与激活码文件夹,找到 jetbrains-agent. ...
- FOC_矢量控制相关资料
http://www.eepw.com.cn/news/listbylabel/label/FOC/ FOC(field-oriented control)为磁场导向控制,又称为矢量控制(vector ...
- centos更换损坏硬盘uuid改变导致系统不能正常启动处理
1.因为挂载磁盘uuid错误导致,而系统在启动的时候,会读取fstab文件.来加载预设的硬盘到指定的分区目录,但读取到需要挂载的UUID的磁盘不存在,中断文件的读取,然后提示文件系统错误,不能解析UU ...
- Jenkins 入门介绍
一.概念 近几年,DevOps理念一致处于一个比较热门的状态.我每个月在工作群或者技术交流群都会看到这个名词出现.前年,当我第一次看到这个"DevOps",我压根不知道这是一个什么 ...
- HDFS 05 - HDFS 的元数据管理(FSImage、EditLog、Checkpoint)
目录 1 - NameNode 的启动流程 2 - NameNode 的元数据 2.1 EditLog 操作日志 2.2 查看 EditLog 文件 2.3 FSImage 元数据镜像 2.4 查看 ...
- GO学习-(39) 优雅地关机或重启
优雅地关机或重启 我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid的方式会强制关闭进程,这样就会导致服务端当前正在处理的请求失败,那有没有更优 ...
- ELK技术栈之-Logstash详解
ELK技术栈之-Logstash详解 前言 在第九章节中,我们已经安装好Logstash组件了,并且启动实例测试它的数据输入和输出,但是用的是最简单的控制台标准输入和标准输出,那这节我们就来深入的 ...
- spring IOC DI AOP MVC 事务, mybatis 源码解读
demo https://gitee.com/easybao/aop.git spring DI运行时序 AbstractApplicationContext类的 refresh()方法 1: pre ...