基于Redis、Storm的实时数据查询实践
通过算法小组给出的聚合文件,我们需要实现一种业务场景,通过用户的消费地点的商户ID与posId,查询出他所在的商圈,并通过商圈地点查询出与该区域的做活动的商户,并与之进行消息匹配,推送相应活动信息到用户手机。
那么整个流程分为两步,第一步,将整个聚合文件刷入缓存,文件数据格式如下:
字段含义分别是 地区编号、商圈编号、商户编号、Pos编号、商户名称、合作商户标志。那么我们可以通过 商户编号+Post编号 来定位 其所在的商圈, 可以通过 地区编号+商圈编号 来获取该商圈的所有商户信息(Redis中直接set)。于是导入Redis是可使用key:商户编号+Post编号 value:地区编号+商圈编号 。 随之第二个key 为 地区编号+商圈编号 从而得到 该商圈的所有商户(Redis中使用hset)。
将聚合文件导入Redis,,部分代码如下
String merchantId = StringUtils.join("V_",content[2].trim(),content[3].trim());
String areabiz = StringUtils.join(content[0].trim(),content[1].trim());
String merchantName = StringUtils.join(content[4].trim());
String flag = StringUtils.join(content[5].trim());
Map<String,String> MerchantMap = new HashMap<String,String>();
MerchantMap.put(merchantName, merchantId);
try {
for (int i = 0; i < jedisvPools.size(); i++) {
JedisPool jp = jedisvPools.get(i);
Jedis jedis = null;
try {
jedis = jp.getResource();
//key为商户编号+PosId value为地区编号area+商圈编号bizAreaId
jedis.set(merchantId, areabiz);
//key为商圈编号+PosId value为商户名称,使用sadd添加相同商圈编号+PosId的商户
if("1".equals(flag)){
jedis.hmset(areabiz, MerchantMap);
}
} catch (Exception e) {
logger.error("", e);
} finally {
jedis.close();
}
}
将需要匹配的活动商户文件及信息导入redis,,部分代码如下
if (StringUtils.isEmpty(content[4]) || StringUtils.isEmpty(content[5])
||StringUtils.isEmpty(content[6])) {
logger.warn("数据格式有误,内容为:{}", line);
return;
}
String merchantId = "";
String posIds = StringUtils.join(content[5]);
String address = StringUtils.join(content[3]);
String[] posIdArray = posIds.split("、");
String url = content[6];
Map<String,String> MerchantUrlAdress = new HashMap<String,String>();
MerchantUrlAdress.put(address,url);
for(String posId : posIdArray){
merchantId = StringUtils.join("Vir_",content[4].trim(),posId.trim());
try {
for (int i = 0; i < jedisPools.size(); i++) {
JedisPool jp = jedisPools.get(i);
Jedis jedis = null;
try {
jedis = jp.getResource();
//key为商户编号+PosId value为地区编号area+商圈编号bizAreaId
jedis.hmset(merchantId,MerchantUrlAdress);
} catch (Exception e) {
logger.error("", e);
} finally {
//jedis.close();
jp.returnResourceObject(jedis);
}
}
接入用户实时刷卡消费信息,流入storm,匹配该用户所在商圈的活动商户,并匹配获取该活动商户的地址及url信息 通过http的形式推送至支付宝或微信渠道,部分代码如下:
String bizAreaName = "";
String bizAreaUrl = "";
String address = "";
//根据活动商户ID与postId 查询所在商圈
String areabiz = virtualBusinessService.getAreaBiz(MerchantId);
if(null == areabiz){
resultSets.addValue(ResultSets.OpType.INSERT,"BIZAREALISTNAME",bizAreaName);
resultSets.addValue(ResultSets.OpType.INSERT, "BIZAREAURL", bizAreaUrl);
resultSets.addValue(ResultSets.OpType.INSERT, "BIZADDRESS", address);
logger.info("VirtualTradeAreaAlgorithm="+MerchantId);
return resultSets;
}
//根据活动ID,获取该活动配置的商户Id
String activityMerchantCode = virtualBusinessService.getActivityConf(activityConfId);
//查询所在商圈的所有商户信息
Map<String,String> bizAreaNameMap = virtualBusinessService.getbizAreaNameSet(areabiz);
if(!bizAreaNameMap.isEmpty()){
//匹配活动配置的商户
for(String bizName : bizAreaNameMap.keySet()){
String mapvalue = bizAreaNameMap.get(bizName).replace("V_", "");
if(activityMerchantCode.contains(mapvalue)){
bizAreaName = bizName;
//根据活动商户名称查询该商户对应的商户ID
activityMerchantId = bizAreaNameMap.get(bizName).replace("V_","Vir_");
//根据活动商户Id,查询该活动商户的url Vir_89811144816144501080209
Map<String,String> bizAreaUrlAdree = virtualBusinessService.getBizUrl(activityMerchantId);
if(null == bizAreaUrlAdree){
address = "";
bizAreaUrl = "";
}else{
for(String bizAdress : bizAreaUrlAdree.keySet()){
address = bizAdress;
bizAreaUrl = bizAreaUrlAdree.get(bizAdress);
}
}
break;
}
}
}
具体还在整理,后续将其补全~
基于Redis、Storm的实时数据查询实践的更多相关文章
- 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原
一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数据可以 ...
- 基于MySQL Binlog的Elasticsearch数据同步实践
一.为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数 ...
- redixdb 基于redis 协议的实时key-value 存储
redixdb 是一个基于redis 协议搞的一个实时key value 处理的轻量级应用,支持多种后端 存储模型. 以下是一个小版的容器镜像(官方的太大了) dockerfile FROM go ...
- Robinhood基于Apache Hudi的下一代数据湖实践
1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...
- 基于redis的IP地址快速查询
在一些大数据处理中,我们需要用到IP地址查询,一般为了查询一个IP属于哪个地址,我们通常需要根据一个IP数据库来查询,网络上比较常用的IP库是纯真IP数据库.IP数据库里面的记录一般存储方式为IP的开 ...
- Redis和Memchaed缓存数据查询
使用TreeNMS数据库管理工具 支持Redis和Memchaed并存同时管理维护,支持集群管理,减少运维成本,提高工作效率 自带环境,免安装.免布署,下载解压即可使用.适用于windows,Linu ...
- 字节跳动流式数据集成基于Flink Checkpoint两阶段提交的实践和优化
背景 字节跳动开发套件数据集成团队(DTS ,Data Transmission Service)在字节跳动内基于 Flink 实现了流批一体的数据集成服务.其中一个典型场景是 Kafka/ByteM ...
- 美团点评基于 Flink 的实时数仓建设实践
https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...
- 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用
https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...
随机推荐
- winform 自定义控件引用问题
最近做了一个仿combobox的控件,与combobox类似,多了文字筛选的功能,如何实现在这里不再赘述.由于comboboxEx中用到了另一个用户控件,当生成dll,引用到项目中去时,发现工具栏中不 ...
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
- (转) Xcode 7 Bitcode
Xcode 7 Bitcode的工作流程及安全性评估 2015-12-18 06:13 编辑: suiling 分类:iOS开发 来源:FreeBuf黑客与极客 简介 随着 Xcode 7 的发布,苹 ...
- WWDC 2014 发布会 Keynote 视频下载 3.6G 1080P地址
我费尽九牛二虎之力,终于可以下载这个1080P高清的视频了,话说今天凌晨我是看的图文直播,现在终于有视频了,大家会不会很激动啊,好废话不多说,我把下载地址发给大家! 百度云:http://pan.ba ...
- 项目中Gradle使用总结
一.配置Gradle使用Maven仓库 项目过程中,我们可能会遇到maven的本地库和gradle使用的maven本地库,不是同一个库.现在总结下怎么配置使得maven和gradle都使用相同的mav ...
- 二叉树[C实现]
#include<stdio.h> #include<malloc.h> #include<iostream> //定义节点 typedef struct BiNo ...
- C#编程语言与面向对象—— 多态
多态编程的基本原理是: 使用基类或接口变量编程. 在多态编程中,基类一般都是抽象类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法.或者使用接口,每个接口都规定了一个或多个抽象方法,实现 ...
- Codeforces Round #284 (Div. 2)A B C 模拟 数学
A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...
- iOS 汉字拼音
获取汉字的拼音 #import <Foundation/Foundation.h> @interface NSString (Utils) /** * 汉字的拼音 * * @retur ...
- SVN-Server搭建及配置
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...