通过算法小组给出的聚合文件,我们需要实现一种业务场景,通过用户的消费地点的商户ID与posId,查询出他所在的商圈,并通过商圈地点查询出与该区域的做活动的商户,并与之进行消息匹配,推送相应活动信息到用户手机。

那么整个流程分为两步,第一步,将整个聚合文件刷入缓存,文件数据格式如下:

  29 1:1 102100156910958 10015691 X有限公司 0 1
  29 1:1 102100156910958 10015691 X有限公司 0 1

  字段含义分别是 地区编号、商圈编号、商户编号、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的实时数据查询实践的更多相关文章

  1. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原

    一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数据可以 ...

  2. 基于MySQL Binlog的Elasticsearch数据同步实践

    一.为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数 ...

  3. redixdb 基于redis 协议的实时key-value 存储

    redixdb 是一个基于redis 协议搞的一个实时key value 处理的轻量级应用,支持多种后端 存储模型. 以下是一个小版的容器镜像(官方的太大了) dockerfile   FROM go ...

  4. Robinhood基于Apache Hudi的下一代数据湖实践

    1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...

  5. 基于redis的IP地址快速查询

    在一些大数据处理中,我们需要用到IP地址查询,一般为了查询一个IP属于哪个地址,我们通常需要根据一个IP数据库来查询,网络上比较常用的IP库是纯真IP数据库.IP数据库里面的记录一般存储方式为IP的开 ...

  6. Redis和Memchaed缓存数据查询

    使用TreeNMS数据库管理工具 支持Redis和Memchaed并存同时管理维护,支持集群管理,减少运维成本,提高工作效率 自带环境,免安装.免布署,下载解压即可使用.适用于windows,Linu ...

  7. 字节跳动流式数据集成基于Flink Checkpoint两阶段提交的实践和优化

    背景 字节跳动开发套件数据集成团队(DTS ,Data Transmission Service)在字节跳动内基于 Flink 实现了流批一体的数据集成服务.其中一个典型场景是 Kafka/ByteM ...

  8. 美团点评基于 Flink 的实时数仓建设实践

    https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...

  9. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

随机推荐

  1. 软件工程总结(Final)

    又到了学期末了,此时此刻软件工程课业接近尾声了.时间过得太快,仿佛昨天这学期的课才开始, 开学时,老师让我们提出了不少对这门课的问题和疑惑,通过一学期的努力学习,我可以试着解开我自己的疑问了. 下面是 ...

  2. 第二章 搭建Android开发环境--读书笔记

    俗话说,工欲善其事,必先利其器,对于Android驱动开发来说,首先我们要做的就是搭建Android开发环境,我们首先要配置Linux驱动的开发环境,接着还得配置开发Android应用程序以及Andr ...

  3. 火车头wordpress免费万能发布模块和接口

    火车头wordpress免费万能发布模块和接口实测可以用 http://www.ggfenxiang8.com/?p=263

  4. PB代码动态解析执行器

    当你看到VB.VFP等开发语言提供的强大的宏执行功能,是不是很羡慕呢?当你寻遍PB的帮助.关于PB开发的书籍或网站而不可得的时候,是不是感到有一丝的遗憾?如果你看到这篇文章,你应该感到振奋,因为你终于 ...

  5. maven - 安装与配置

    最近在了解maven的相关东西,在网上查了一些资料,现在简单整理一下. 一.maven 安装 1.先检查JDK ,Maven是一个java工具,所以请确保jdk环境已经正确安装在你的机器上. 2.点击 ...

  6. java 读写properties

    网速不好:先贴上资料: Java配置文件Properties的读取.写入与更新操作 [Spring] - Property注入 http://www.360doc.com/content/14/073 ...

  7. Python 文件操作函数

    这个博客是 Building powerful image classification models using very little data 的前期准备,用于把图片数据按照教程指示放到规定的文 ...

  8. UICollectionViewCell选中高亮状态和UIButton的高亮状态和选中状态

    UICollectionViewCell选中高亮状态 //设置点击高亮和非高亮效果! - (BOOL)collectionView:(UICollectionView *)collectionView ...

  9. ios 多种传值方式

    在网上看了看传值方法,没有找到完整的.在这把自己看到的几种传值方法写写吧. 1 . 属性传值 2 . 通知传值 3 . 代理传值 4 . block传值 5 . 单列传值 6 . ShareAppli ...

  10. Servlet中The requested resource is not available错误

    自己为了测试servlet,用MyEclipse2015写了一个简单的登录程序. 1.登录页面index.jsp. <%@ page language="java" impo ...