通过算法小组给出的聚合文件,我们需要实现一种业务场景,通过用户的消费地点的商户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. C#常用操作类库五(电脑操作类)

    /// <summary> /// Computer Information /// </summary> public class ComputerHelper { publ ...

  2. 如何清除SQL Server Management Studio的最近服务器列表

    SQL Server Management Studio (SSMS) 的"连接到服务器"对话框会记录用户所有访问过的服务器名称,这个功能对于经常连接多个数据库的人来说确实挺方便的 ...

  3. Professional.WebGL.Programming-Chapter 2(高级WebGL编程——第二章)

    (目前发现一些文章被盗用的情况,我们将在每篇文章前面添加原文地址,本文源地址:http://www.cnblogs.com/idealer3d/p/3508251.html) 这一章主要通过创建一个三 ...

  4. K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  5. Node.js高效按行输出文件内容

    const fs = require('fs'); const EventEmitter = require('events'); const util = require('util'); cons ...

  6. ie8兼容

    最近在做ie8兼容,把遇到的问题整理了一下 1. margin:0 auto; 无法居中 解决方法:1.换成h4的文档类型 <!DOCTYPE html PUBLIC "-//W3C/ ...

  7. jquery+ajax跨域请求webservice

    最近几天在学习webservice...在学习的时候便想到用ajax的方式去请求webservice.. 一直在测试..如果这个被请求的webservice和自己使用的是同一个端口号.则不用考虑那aj ...

  8. mysql常用操作

    一.什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. SQL( Structured Query Language)语言的全称是结构化查询语言.数据库管理系统通过S ...

  9. groupspecWidhoutAuthorizations与groupspecWidthAuthorizations的区别

    GroupSpecifier是一个用来定义group所有参数的类.首先,将它命名为“myGroup/g1”.然后设置 serverChannel与Stratus进行沟通.最后发布.这样,我们就完成了P ...

  10. POJ 1014 Dividing

    Dividing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 66032 Accepted: 17182 Descriptio ...