基于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,获取该活动配置的商户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;
                    }
                }
            }                                    

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数说工作室

【SAS Says】基础篇:SAS宏初步

特别说明:本节【SAS Says】基础篇:SAS宏初步,用的是数说君学习《The little SAS book》时的中文笔记,我们认为这是打基础的最好选择。 ...

3214
来自专栏诸葛青云的专栏

手把手教你用c语言编写网络病毒

恶意软件可能是第一个对我们产生影响的计算机安全问题.所以病毒在信息安全中是很重要的.

4192
来自专栏蓝天

转载:x86的cpu_relax解析

内核执行的任务在很多情况下是不加锁的,只是poll某个公有变量去保证同步。再深一步,即使是使用锁,本质上也是一个poll某个公有变量的过程。这个poll的过程需...

1212
来自专栏lgp20151222

Java规则引擎drools:drt动态生成规则并附上具体项目逻辑

由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面。

9086
来自专栏dotnet & java

WCF入门 (14)

做了一份面试题,最后一题是数据库的,写个查询。要查出Score有两次及两次以上超过79的Name和他的最高得分,同时显示超过79分的次数。

932
来自专栏菩提树下的杨过

AS1.0(2.0)中的XML示例

虽然Flash早就升级为AS3.0,但是FMS的服务端编程依然仅支持AS1.0(2.0),服务端与.net通讯的最简单方式莫过于请求一个RESTful的webS...

2046
来自专栏数说工作室

【SAS Says】基础篇:7. SAS宏初步

宏用来处理重复工作最好,比如你需要跑10个回归,用proc reg...,这10个回归其他都一样,就是因变量y每次需要换。那么将回归程序写成一个宏,每次用的时候...

3936
来自专栏数据结构与算法

P1816 忠诚

题目描述 老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意。但...

2695
来自专栏GreenLeaves

Oracle pl/sql编程值控制结构

以下测试案例均来自于scott方案,运行前请确保该方案解锁。 1、条件分支状语 pl/sql中提供了三种条件分支状语,分别是: if   then if   t...

1989
来自专栏battcn

一起学设计模式 - 中介者模式

在我们的生活中处处充斥着中介者,比如租房、买房、出国留学、找工作、旅游等等可能都需要那些中介者的帮助,同时我们也深受其害,高昂的中介费,虚假信息。 在地球上最大...

1002

扫码关注云+社区

领取腾讯云代金券