kettle如何3秒内写入100万条数据到Redis
kettle如何3秒内写入100万条数据到Redis
1.实现结果
先来看下实现结果,如下图,本地写入100万数据,耗时2.3s,每秒44万。接下来说说如何实现:
数据存储结构样例:
2.添加redis包放到kettle的lib目录
jedis-3.1.0.jar
3.生成记录步骤
用于生成测试数据:
4.增加序列步骤
用于生成redis的key值
5.Json输出
用于将原始数据封装为一个json,存储到redis中:
json输出:字段页签,用于说明json中包含的字段信息:
6.Java 写入redis缓存
主要使用到了Pipeline类,实现批量提交:
详细代码如下:
// etl-java-redis
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;private Jedis jedis=null;
private JedisPool pool=null;
Pipeline pipe = null;
int cache_size=10000; // 批量提交大小
int cur_size=0; // 当前数据缓存量public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {if (first) {first = false;// connect to redis serverString redis_ip = getVariable("redis.ip", "127.0.0.1");String redis_port = getVariable("redis.port", "6379");String redis_password = getVariable("redis.password", "");cache_size = Integer.valueOf(getVariable("redis.cache_size", "10000"));logBasic(redis_ip+":"+redis_port);logBasic("redis_password:"+redis_password);// 连接池方式JedisPoolConfig config = new JedisPoolConfig();config.setMaxIdle(8);config.setMaxTotal(18);pool = new JedisPool(config, redis_ip, Integer.valueOf(redis_port), 2000, redis_password);jedis = pool.getResource(); jedis.select(1);// 切换数据库pipe = jedis.pipelined(); // 创建pipeline 对象logBasic("Server is running: " + jedis.ping());}Object[] r = getRow();if (r == null) {setOutputDone();pipe.sync();jedis.close();pool.close();return false;}// It is always safest to call createOutputRow() to ensure that your output row's Object[] is large// enough to handle any new fields you are creating in this step.r = createOutputRow(r, data.outputRowMeta.size());/*Redis数据存储(Redis-String)key : KEYvalue : JsonData*/String key = get(Fields.In, "id").getString(r);String value = get(Fields.In, "JsonData").getString(r);logDebug(key + "\t" + value);// 写入缓存pipe.set(key, value);cur_size++;if (cur_size % cache_size == 0 && cur_size > 0) {// 当达到缓存最大值时提交pipe.sync(); // 同步cur_size=0; // 复位}// Send the row on to the next step.putRow(data.outputRowMeta, r);return true;
}
7.命名参数
将可变参数存储到命名参数中,方便迁移:
– 本文结束 –
kettle如何3秒内写入100万条数据到Redis相关推荐
- 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)
实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方法所耗费的时间. 本实验中所用到工具为VS2008和SQL SERVER 2000.S ...
- 导出100万条数据到excel
导出100万条数据到excel 目的 数据库中有100万条数据,用java程序导入到excel,所花费的时间 演示 过程 eclipse 创建main sqlserver连接数据库程序 TCP/IP连 ...
- qt中的mysql能存入多少行数据_Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)...
SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度.例如:向数据库中插入100万条数 ...
- sql server批量插入数据库的操作100万条数据
1.数据库中 首先创建表->连接数据库->通过循环插入数据 2.建立测试表 在这里插入代码[c-sharp] view plain copy --Create DataBase creat ...
- Oracle查询前100万条数据
Oracle不支持select top语句,在Oracle中经常是用order by跟rownum select 列名1 ...列名n from ( select 列名1 ...列名n fro ...
- 查询分析300万笔记录_给你100万条数据的一张表,你将如何查询优化?
1.两种查询引擎查询速度(myIsam 引擎) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. ...
- Mysql 给你100万条数据的一张表,你将如何分页查询优化?
1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. ...
- 给你100万条数据的一张表,你将如何查询优化?
1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. ...
- mysql100万数据一键下载csv_使用PHP来导入包含100万条数据的csv文件,请问你最快多久能全部导入mysql 数据库?...
mysql> load data infile '/tmp/mytable.csv' into table mytable; load data infile肯定是最快的. 如果要用PHP来做, ...
最新文章
- bugku 杂项 就五层你能解开吗_9.65米解放龙V杂项危险废物厢式运输车62
- 【2016年第4期】欧盟数据可携权评析
- Beta版本测试报告以及Beta版本发布说明
- 莫比乌斯反演 BZOJ 2820
- JavaSE学习--正则表达式
- Java语言设计文本查找器和文本编辑器
- php 删除服务器指定目录图片
- RTL8187L usb驱动编译
- 聚类及DBSCAN 聚类算法
- excel柱状图自定x轴y轴_Excel制作双坐标轴图表与把X轴与Y轴改为月份及使坐标轴带方向...
- Pytorch模型训练(0) - CPN源码解析
- 使用pynput监听键盘组合键
- 题解 P3588 [POI2015]PUS
- Java项目:SSM图书馆图书管理借阅书籍管理系统
- 气象数据的常用格式以及处理的工具
- CentOS国内镜像源地址汇总持续更新
- PS竖排英文和数字文字怎么改变方向(变竖直显示)
- 那个爆火的“梦中修炼”AI,你也能用Keras搭一个了
- 通道滤镜,笔刷——破损字体制作方法
- word如何设置长宽高_word页面高度怎么设置