本文是对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单节点千万级别数据 写入,读取 性能测试的更多相关文章

  1. Redis 单节点百万级别数据 读取 性能测试.

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 这里先进行造数据,向redis中写入五百万条数据,具体方式有如下三种: 方法一:(Lua 脚本) vim ...

  2. Java链接Redis时出现 “ERR Client sent AUTH, but no password is set” 异常的原因及解决办法

    Java链接Redis时出现 "ERR Client sent AUTH, but no password is set" 异常的原因及解决办法 [错误提示] redis.clie ...

  3. 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 ...

  4. mysql数据库千万级别数据的查询优化和分页测试

    原文地址:原创 mysql数据库千万级别数据的查询优化和分页测试作者:于堡舰 本文为本人最近利用几个小时才分析总结出的原创文章,希望大家转载,但是要注明出处 http://blog.sina.com. ...

  5. java之5分钟插入千万条数据

    虽说不一定5分钟就插入完毕,因为取决去所插入的字段,如果字段过多会稍微慢点,但不至于太慢.10分钟内基本能看到结果. 之前我尝试用多线程来实现数据插入(百万条数据),半个多小时才二十多万条数据. 线程 ...

  6. flink04 -----1 kafkaSource 2. kafkaSource的偏移量的存储位置 3 将kafka中的数据写入redis中去 4 将kafka中的数据写入mysql中去

    1. kafkaSource 见官方文档 2. kafkaSource的偏移量的存储位置 默认存在kafka的特殊topic中,但也可以设置参数让其不存在kafka的特殊topic中   3   将k ...

  7. JAVA使用POI如何导出百万级别数据(转)

    https://blog.csdn.net/happyljw/article/details/52809244   用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会 ...

  8. JAVA使用POI如何导出百万级别数据

    用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...

  9. JAVA使用POI如何导出百万级别数据(转载)

    用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...

随机推荐

  1. shell基础之后台运行脚本

    使shell脚本后台执行,基本的方法有两种,第一种为在脚本后面追加&符号,第二种为在脚本前面使用nohup命令,结尾再追加&符号 一.后台运行脚本1 1.执行脚本test.sh:./t ...

  2. AD中如何解决 同一局域网下证书冲突问题

    AD中如何解决  同一局域网下证书冲突问题 https://wenku.baidu.com/view/c20e1720482fb4daa58d4b52.html

  3. Linux系统添加永久静态路由的方法(包含Centos7)

    一.使用route命令添加 使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了,方法:A.添加到主机的路由# route add –host 192.168.1.10 dev eth0 ...

  4. Python小白的数学建模课-03.线性规划

    线性规划是很多数模培训讲的第一个算法,算法很简单,思想很深刻. 要通过线性规划问题,理解如何学习数学建模.如何选择编程算法. 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛 ...

  5. MMF的初步介绍:一个规范化的视觉-语言多模态任务框架

    在VQA, Image Caption等任务中,构建模型是一件工作量较大的工作.有没有什么能减少这些重复的工作量呢?与此同时,Pytorch,tensorflow等开源的深度学习工具包发布,大大减少了 ...

  6. Python+Selenium - 文件上传

    如下图,从系统点击上传功能,打开到这种如下图页面的才适合本文介绍的处理方法 处理方法一 pywinauto库 优点:可以选择多个文件,路径中有中文也支持 缺点:只能Windows平台使用 安装 pip ...

  7. 结构感知图像修复:ICCV2019论文解析

    结构感知图像修复:ICCV2019论文解析 StructureFlow: Image Inpainting via Structure-aware Appearance Flow 论文链接: http ...

  8. AlexeyAB DarkNet YOLOv3框架解析与应用实践(二)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(二) 版本3有什么新功能? YOLOv3使用了一些技巧来改进训练和提高性能,包括:多尺度预测.更好的主干分类器等等.全部细节都在我们的 ...

  9. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  10. NSight Compute 用户手册(上)

    NSight Compute 用户手册(上) 非交互式配置文件活动 从NVIDIA Nsight Compute启动目标应用程序 启动NVIDIA Nsight Compute时,将出现欢迎页面.单击 ...