基于Redis、Storm的实时数据查询实践

通过算法小组给出的聚合文件,我们需要实现一种业务场景,通过用户的消费地点的商户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,获取该活动配置的商户IdString 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;//根据活动商户名称查询该商户对应的商户IDactivityMerchantId = bizAreaNameMap.get(bizName).replace("V_","Vir_");//根据活动商户Id,查询该活动商户的url Vir_89811144816144501080209Map<String,String> bizAreaUrlAdree = virtualBusinessService.getBizUrl(activityMerchantId);if(null == bizAreaUrlAdree){address = "";bizAreaUrl = "";}else{for(String bizAdress : bizAreaUrlAdree.keySet()){address = bizAdress;bizAreaUrl = bizAreaUrlAdree.get(bizAdress);}}break;}}}                                    

 具体还在整理,后续将其补全~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从离散值中把值相近的放在一起

//30根细条得到30个长度值&#xff0c;选择出现值相近且出现次数最多的&#xff0c;算其均值作为输出 #include <iostream> using namespace std;int main() {double dRawdata[5] {1.1,1.2,1.3,2.5,3.2};//先升序排序double dSort[5][5] {0};double* p dRawdata;int a…

register_globals(全局变量注册开关)

register_globals&#xff0c;是php.ini文件里面的一个配置选项&#xff0c;接下来&#xff0c;我们可以通过例程来分析一下&#xff0c;当register_globals on 与 register_globals off 的时候&#xff0c;对php语言的一些安全影响。测试源代码如下&#xff1a;index.html 源…

精述IBM的MQTT协议和MQTT-S协议

一&#xff0e;MQTT简介 MQTT (Message Queuing Telemetry Transport) 是由IBM研发的构建在TCP/IP之上的简单轻量的消息协议&#xff0c;目标使用场景为受限制环境&#xff0c;如低带宽、高延迟、不可靠网络&#xff0c;很适用于M2M和IoT中。它的竞争协议包括XMPP协议和IETF的C…

20150103--SQL连接查询+视图-02

20150103--SQL连接查询视图-02 子查询 一条查询语句出现在另外一条查询语句的内部&#xff0c;这条语句就被称之为子查询语句。 子查询分类 子查询可以根据子查询返回的结果以及子查询出现的位置两种方式进行分类 按结果分类&#xff1a; 标量子查询&#xff1a;子查询返回的结…

QtQuick controls和controls2 自定义样式

2019独角兽企业重金招聘Python工程师标准>>> controls import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Rectangle {color: "green"Button {id:buttontext: qsTr("Second page")anchors.centerIn: parentpr…

电脑开机3秒就重启循环_电脑修好后客户不愿支付上门费,行,那电脑开机60秒自动关机吧!...

上门维修电脑已经非常普及了&#xff0c;上门维修电脑费用要比送修(送到维修店)费用高&#xff0c;送修电脑只有一项维修费用&#xff0c;上门维修电脑比送修多了一项费用&#xff0c;这项费用就是上门费。有人说维修电脑收取上门费用不合理&#xff0c;其实这样的说法非常自私…

jQuery属性筛选选择器

2019独角兽企业重金招聘Python工程师标准>>> 代码一 <h2>属性筛选选择器</h2><h3>[attval]、[att]、[att|val]、[att~val]</h3><div class"left" testattr"true" ><div class"div" testattr"t…

java 代码优化

Java程序中的内存管理机制是通过GC完成的&#xff0c;“一个对象创建后被放置在JVM的堆内存中&#xff0c;当永远不在应用这个对象的时候将会被JVM在堆内存中回收。被创建的对象不能再生&#xff0c;同时也没有办法通过程序语句释放”&#xff08;这个是《Java的GC机制》中提到…

Halcon中OCR的实现及关键函数解析

OCR的实现共分为两步&#xff0c;1是使用字符数据来训练OCR。2是使用OCR进行字符的识别。 训练分类器 训练分类器共分为4步&#xff1a; 1是使用阈值来分割字符区域&#xff1b; 2是调用append_ocr_trainf函数将字符加入训练集&#xff1b; 3是创建分类器&#xff1b; 4是…

MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法

在Matlab中&#xff0c;做短时傅里叶变换需要使用函数spectrogram&#xff0c;而在Matlab2019中&#xff0c;引入了一个新的函数stft&#xff0c;下面我们就来看下这两个函数都如何使用。短时傅里叶变换的基本原理就是将数据分段加窗&#xff0c;做fft&#xff0c;在分段时会有…

Qt 【关于控件样式,鼠标进入、离开、点击】

比如举以下这个例子: QPushButton * okBtn; okBtn->setstylesheet("QPushButton{border-image:url(:/image/hello);}"); //这个是最常规的样式 okBtn->setstylesheet("QPushButton{border-image:url(:/image/hello);}" //…

图像处理基础——灰度共生矩阵

标准定义如下&#xff1a;对于取定的方向θ 和距离 d, 在方向为θ的直线上, 一个像元灰度为 i, 另一个与其相距为 d 像元的灰度为 j 的点对出现的频数即为灰度共生矩阵第(i, j)阵元的值。 怎样理解呢&#xff1f;看起来好复杂呀 呜呜呜 小白理解&#xff1a;灰度共生矩阵就…

iphone查看删除的短信_iPhone12发布!刚买的苹果手机短信全部消失了怎么办?

原标题&#xff1a;iPhone12发布&#xff01;刚买的苹果手机短信全部消失了怎么办&#xff1f;目前&#xff0c;人们的社交除了面对面交谈&#xff0c;用的最多的就是通过手机进行聊天&#xff0c;比如用QQ、微信和短信、邮件等方式&#xff0c;虽然短信不会用来一般的聊天&…

[唐诗]182宫中行乐词(其一)-李白

宫中行乐词(其一)-李白 小小生金屋&#xff0c; 盈盈在紫微。 山花插宝髻&#xff0c; 石竹绣罗衣。 每出深宫里&#xff0c; 常随步辇归。 只愁歌舞散&#xff0c; 化作彩云飞。

python基础之01数据类型-变量-运算浅解

python的数据类型 1 数字 数字分为整型&#xff08;int&#xff09;&#xff0c;长整型&#xff08;long&#xff09;&#xff0c;浮点型&#xff08;float&#xff09;&#xff0c;复数&#xff08;complex&#xff09; 整型较为常用的功能&#xff1a; >>> a-4 >…

使用Caffe进行手写数字识别执行流程解析

之前在 http://blog.csdn.net/fengbingchun/article/details/50987185 中仿照Caffe中的examples实现对手写数字进行识别&#xff0c;这里详细介绍下其执行流程并精简了实现代码&#xff0c;使用Caffe对MNIST数据集进行train的文章可以参考 http://blog.csdn.net/fengbingchun/…

obs可以装手机吗?_原神PC和手机数据互通吗 PC和手机可以一起玩吗

在原神中&#xff0c;很多玩家都在PC端创建了角色&#xff0c;那么疑问来了&#xff0c;PC端与手机端的账号会是互通的吗&#xff1f;下面小编就为大家带来原神PC和手机数据互通吗的相关内容&#xff0c;一起来看看吧&#xff01;更多攻略&#xff1a;原神攻略大全PC和手机数据…

学习linux第二周作业

第二周作业&#xff1a;本周作业内容&#xff1a;1、Linux上的文件管理类命令都有哪些&#xff0c;其常用的使用方法及其相关示例演示。touch,rm,mv,cp,file,ls,chmod,chown,ln,rename,touch 修改文件atime&#xff0c;如果文件不存在&#xff0c;那么创建该文件。rm&#xff1…

三维点云目标提取总结(续)

三维点云目标提取&#xff08;续&#xff09; 3.三维点云目标提取 3.1一般流程 先根据个人认识总结一下目标提取的一般性步骤&#xff1a; 如上所示&#xff0c;三维点云的目标提取关键性的两步即为&#xff1a;特征提取与选择、分类&#xff0c;是不是整个方法流程与图像中的目…

安卓高手之路之java层Binder

很多人一提到Binder就说代理模式&#xff0c;人云亦云的多&#xff0c;能理解精髓的少。 本篇文章就从设计角度分析一下java层BInder的设计目标&#xff0c;以及设计思路&#xff0c;设计缺陷&#xff0c;从而驾驭它。 对于【邦德儿】的理解, 从通信的角度来看&#xff0c;就是…