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 ...
随机推荐
- 技术干货 | 关于 WKWebview 网络拦截,你想知道的都在这里
原生 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此在 WKWebView 上直接使用 NSURLProtocol 是无法拦截请求的. 但是由于 mPa ...
- Apple macOS 下载汇总
macOS Big Sur 11,macOS Catalina 10.15,macOS Mojave 10.14,macOS High Sierra 10.13,macOS Sierra 10.12 ...
- 删除本地解压版Mysql
1.关闭服务 以管理员身份运行cmd,使用命令net stop mysql停止服务. 2.卸载服务 使用命令mysqld -remove mysql卸载服务. 这时候在服务里已经找不到mysql服务了 ...
- 论鸿蒙OS在某些人眼中的样子
对于鸿蒙OS,博客园有一篇文章<为鸿蒙OS说两句公道话(我对鸿蒙OS的一些看法)>.有兴趣的可以看看. 在这篇文章中,个人觉得最精彩的不是文章本身,而是评论内容. 下面我挑一些出来,和大家 ...
- LogMysqlApeT
with LogMysqlApeT(db) as m_client: condition = "select * from {} where deleted=0 ".format( ...
- CUDA 7 Stream流简化并发性
CUDA 7 Stream流简化并发性 异构计算是指高效地使用系统中的所有处理器,包括 CPU 和 GPU .为此,应用程序必须在多个处理器上并发执行函数. CUDA 应用程序通过在 streams ...
- LeetCode---105. 从前序与中序遍历序列构造二叉树 (Medium)
题目:105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...
- BIO/NIO/ANO笔记
一: netty服务器启动过程 serverBootstrap.bind(hostname, port)---> doBind(localAddress);--> 1.1: initAnd ...
- linux远程和软件包的管理
远程管理 ssh 用户名@对方IP地址 -X 在本地可以运行对方的图形程序 端口 22 [root@room9pc01 ~]# ssh root@172.25.0.11 [root@serve ...
- 你能说出多线程中sleep、yield、join的用法及sleep与wait区别?
Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...