Storm存储结果至Redis
sudo bin/redis-server conf/redis.6388.conf
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-redis</artifactId>
<version>${storm.version}</version>
</dependency>

@Override
public void execute(Tuple input) {
String key = lookupMapper.getKeyFromTuple(input);
Object lookupValue; JedisCommands jedisCommand = null;
try {
jedisCommand = getInstance(); switch (dataType) {
case STRING:
lookupValue = jedisCommand.get(key);
break; case LIST:
lookupValue = jedisCommand.lpop(key);
break; case HASH:
lookupValue = jedisCommand.hget(additionalKey, key);
break; case SET:
lookupValue = jedisCommand.scard(key);
break; case SORTED_SET:
lookupValue = jedisCommand.zscore(additionalKey, key);
break; case HYPER_LOG_LOG:
lookupValue = jedisCommand.pfcount(key);
break; default:
throw new IllegalArgumentException("Cannot process such data type: " + dataType);
} List<Values> values = lookupMapper.toTuple(input, lookupValue);
for (Values value : values) {
collector.emit(input, value);
} collector.ack(input);
} catch (Exception e) {
this.collector.reportError(e);
this.collector.fail(input);
} finally {
returnInstance(jedisCommand);
}
RedisState and RedisMapState, which provide Jedis interface just for single redis. RedisClusterState and RedisClusterMapState, which provide JedisCluster interface, just for redis cluster.

Options<Object> fiveMinitesOptions = new Options<>();
fiveMinitesOptions.dataTypeDescription = new RedisDataTypeDescription(RedisDataTypeDescription.RedisDataType.HASH,
"controller:5min");
logStream.each(new Fields("logObject"), new Log5MinGroupFunction(), new Fields("key"))
.groupBy(new Fields("key"))
.persistentAggregate(RedisMapState.nonTransactional(poolConfig, fiveMinitesOptions), new Fields("logObject"),
new LogCombinerAggregator(), new Fields("statistic"));
controller:5min
Log5MinGroupFunction生成的key,LogCombinerAggregator合并完成后的value;
@Override public List<T> multiGet(List<List<Object>> keys) {
if (keys.size() == 0) {
return Collections.emptyList();
}
List<String> stringKeys = buildKeys(keys);
List<String> values = retrieveValuesFromRedis(stringKeys);
return deserializeValues(keys, values);
}
private List<String> buildKeys(List<List<Object>> keys) {
List<String> stringKeys = new ArrayList<String>();
for (List<Object> key : keys) {
stringKeys.add(getKeyFactory().build(key));
}
return stringKeys;
}
@Override
public void multiPut(List<List<Object>> keys, List<T> vals) {
if (keys.size() == 0) {
return;
}
Map<String, String> keyValues = new HashMap<String, String>();
for (int i = 0; i < keys.size(); i++) {
String val = new String(getSerializer().serialize(vals.get(i)));
String redisKey = getKeyFactory().build(keys.get(i));
keyValues.put(redisKey, val);
}
updateStatesToRedis(keyValues);
}
@Override
protected List<String> retrieveValuesFromRedis(List<String> keys) {
String[] stringKeys = keys.toArray(new String[keys.size()]); Jedis jedis = null;
try {
jedis = jedisPool.getResource(); RedisDataTypeDescription description = this.options.dataTypeDescription;
switch (description.getDataType()) {
case STRING:
return jedis.mget(stringKeys); case HASH:
return jedis.hmget(description.getAdditionalKey(), stringKeys);
protected void updateStatesToRedis(Map<String, String> keyValues) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
RedisDataTypeDescription description = this.options.dataTypeDescription;
switch (description.getDataType()) {
case STRING:
String[] keyValue = buildKeyValuesList(keyValues);
jedis.mset(keyValue);
if(this.options.expireIntervalSec > 0){
Pipeline pipe = jedis.pipelined();
for(int i = 0; i < keyValue.length; i += 2){
pipe.expire(keyValue[i], this.options.expireIntervalSec);
}
pipe.sync();
}
break;
case HASH:
jedis.hmset(description.getAdditionalKey(), keyValues);
if (this.options.expireIntervalSec > 0) {
jedis.expire(description.getAdditionalKey(), this.options.expireIntervalSec);
}
break;
Storm存储结果至Redis的更多相关文章
- C# Azure 存储-分布式缓存Redis工具类 RedisHelper
using System; using System.Collections.Generic; using Newtonsoft.Json; using StackExchange.Redis; na ...
- C# Azure 存储-分布式缓存Redis在session中的配置
1. 开始 对于分布式的缓存,平常的session的处理是一个用户对应一台分布式的机器,如果这台机器中途挂机或者不能处理这个用户session的情况发生,则此用户的session会丢失,会发生不可预知 ...
- C# Azure 存储-分布式缓存Redis的新建&配置&查看
1. 介绍 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键包括 string,hash,l ...
- 一些应该使用mongodb或者其他文档存储而不是redis或mysql、oracle json的情形(最近更新场景)
通常来说,我们应该使用应用的特性而不是自己的爱好或者规定而去选择一种合适的组件,选择的标准应该是这个组件最适合或者本身其设计就是为了解决这个问题,而不是这个组件能够做这事情为标准.就拿存储来说,任何时 ...
- PHP 更改session存储方式为Redis
前言: 服务器默认的session存放方式是file.当客户端发送请求带有PHPSESSID时是顺序的去比对session存储文件,如果有5000个session文件,那就有可能需要比对4998次那么 ...
- 服务端指南 数据存储篇 | 聊聊 Redis 使用场景(转)
作者:梁桂钊 本文,是升级版,补充部分实战案例.梳理几个场景下利用 Redis 的特性可以大大提高效率. 随着数据量的增长,MySQL 已经满足不了大型互联网类应用的需求.因此,Redis 基于内存存 ...
- 爬虫文件存储-3:Redis
前提条件: 安装并运行redis服务端程序,安装RedisPy库 说明:Redis 是 StrictRedis 的子类,它的主要功能是用于向后兼容旧版本库里的几个方法,官方推荐使用 StrictRed ...
- 【原】thinkphp实现存储session至redis
Thinkphp\Library\Think\Session\Driver中新建redis缓存文件:Redis.class.php Thinkphp\Common\function.php 中 fun ...
- redis数据存储--C++连接redis
一.下载的是Redis Windows版本:下载地址:https://github.com/microsoftarchive/redis:解压到:E:\Software\redis-3.0: 二.用V ...
随机推荐
- Vue.js 源码学习笔记 -- 分析前准备2 -- Object.defineProperty
解析神奇的 Object.defineProperty 几行代码看他怎么用 var a= {} Object.defineProperty( a, "b", { value ...
- FTP 主动模式 与被动模式
今天在被电信运营商给的没有内网ip被nat后的内网ip访问我的ftp服务器时出现了,连接被关闭的错误,经过多番查询发现问题原因是因为NAT内网ip没有被有效地转换为外网ip,也即是说NAT对ftp协议 ...
- AR.Drone 2.0四轴飞机体验:最好的玩具航拍器
http://digi.tech.qq.com/a/20140513/007458.htm?pgv_ref=aio2012&ptlang=2052 AR.Drone 2.0四轴飞机体验:最好的 ...
- Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”
Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛卡尔积,然后在在里面查询符合的 ...
- Ubuntu 18.10安装Firefox 和 Google Chrome
================================ 工作环境迁移到Linux上,操作系统使用Linux Mint19.1(基于Ubuntu的), 自带的浏览器器是低版本的英文版,现在使用 ...
- 【spring源码分析】面向切面编程架构设计
2 注解说明 2.1 @Aspect 作用是把当前类标识为一个切面供容器读取 2.2 @Before标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有 2.3 @AfterRe ...
- tomcat源码阅读之过滤器
一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...
- oracle之 变更OS时间对数据库的影响
本文:说明提供了操作系统日期变更对数据库.应用程序数据和作业的影响. 1.它将会影响插入的任何记录,如果涉及到sysdate,则更改日期.2.它还会影响在那个日期运行的任何调度器作业. 如果将系统时间 ...
- centos 下nginx源码编译安装
1.下载nginx 进入nginx官网下载nginx的稳定版本,我下载的是1.10.3. 下载:wget http://nginx.org/download/nginx-1.10.3.tar.gz 解 ...
- golang panic的捕获
panic发生时, 会导致进程挂掉.为了处理panic, 可以使用recover捕获,然后处理. 下面以下标引用越界问题为例进行说明. 正常情况下,代码中如果出现下标越界,会直接触发panic, 导致 ...