通过算法小组给出的聚合文件,我们需要实现一种业务场景,通过用户的消费地点的商户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. LayaAir引擎——(六)

    LayaAir引擎——TiledMap地图图块属性获取和进行墙壁碰撞检测 需要的软件: TiledMap LayaAir IDE 1.0.2版本 所画的地图: pass层: floor层: pass层 ...

  2. js完美身份证验证

    /*根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数 ...

  3. 分享一些DICOM数据下载网站

    医院的DICOM数据轻易不让拷出来,所以这里列出一些医学数据,但不局限于DICOM数据网址,供大家下载. 斯坦福大学体数据库(RAW DATA) http://graphics.stanford.ed ...

  4. esrdtfyghjk

    两融余额止跌回升,金融股回落飘绿,千股涨停续演,沪指收复4000点未果涨逾2% 相关报道 [今日收盘]灾后重建激情抢筹 大盘两日反弹500点 [今日收盘]沪指涨近6%重回3700点 未停牌个股九成涨停 ...

  5. ScriptableObject本地序列化后重启Unity后报The associated script can not be loaded.Please fix any compile errors and assign a valid script的坑

    踩坑 做编辑器一些设置序列化存在本地的时候,继承自ScriptableObject的类通过 创建的asset文件. 在重启Unity后查看这个asset发现上面的所有序列化属性丢失,报的错就是 在不存 ...

  6. php读取json时无数据(为空)的解决方法

    在使用PHP调用一些json接口文件时 如果使用 file_get_contents 获取页面json数据后 再使用json_decode()解析后 数据无法正常输出 这是的返回值为null 这是由于 ...

  7. 【 D3.js 进阶系列 — 6.1 】 缩放的应用(Zoom)

    缩放(Zoom)是另一种重要的可视化操作,主要是使用鼠标的滚轮进行. 1. zoom 的定义 缩放是由 d3.behavior.zoom() 定义的. var zoom = d3.behavior.z ...

  8. css background-size

    先来看下语法:background-size: length|percentage|cover|contain;具体的值,百分比都ok,w3c上面说的很清楚,当时具体的值或者百分比的时候,第一个表示宽 ...

  9. svm损失函数

    作者:杜客链接:https://zhuanlan.zhihu.com/p/20945670来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. SVM的损失函数定义如下: 举 ...

  10. textarea关于空格和换行那点事

    textarea中空格连续输入多个的情况下,数据回显的时候页面只是显示一个:换行同样有问题,在textarea中有换行,在页面上却没有,今天终于看到个写的比较具体的文章,拿过来收藏下. 地址链接: h ...