基于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;
                    }
                }
            }                                    

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

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/609004

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。