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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 通过算法小组给出的聚合文件,我们需要实现一种业务场景,通过用户的消费地点的商户ID与posId,查询出他所在的商圈,并通过商圈地点查询出与该区域的做活动的商户,并与之进行消息匹配,推送相应活动信息到用户手机。

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

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

目录
相关文章
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
433 0
|
存储 缓存 NoSQL
蚂蚁金服P7私藏的Redis原理与实践内部笔记
Redis 是完全开源免费的,是一个高性能的key-value类型的内存数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
235 1
|
缓存 NoSQL Java
Spring Cache 缓存原理与 Redis 实践
Spring Cache 缓存原理与 Redis 实践
572 0
|
3月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
283 86
|
3月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
174 0
|
5月前
|
存储 缓存 NoSQL
Redis 核心知识与项目实践解析
本文围绕 Redis 展开,涵盖其在项目中的应用(热点数据缓存、存储业务数据、实现分布式锁)、基础数据类型(string 等 5 种)、持久化策略(RDB、AOF 及混合持久化)、过期策略(惰性 + 定期删除)、淘汰策略(8 种分类)。 还介绍了集群方案(主从复制、哨兵、Cluster 分片)及主从同步机制,分片集群数据存储的哈希槽算法。对比了 Redis 与 Memcached 的区别,说明了内存用完的情况及与 MySQL 数据一致性的保证方案。 此外,详解了缓存穿透、击穿、雪崩的概念及解决办法,如何保证 Redis 中是热点数据,Redis 分布式锁的实现及问题解决,以及项目中分布式锁
136 1
|
9月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
439 61
Redis应用—6.热key探测设计与实践
|
7月前
|
缓存 NoSQL Java
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
172 5
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
|
10月前
|
存储 缓存 NoSQL
Redis哈希结构在提升数据检索速度中的实践应用
本文详细介绍了 Redis 哈希结构的特点、常见使用场景以及如何在实际应用中利用哈希结构提升数据检索速度。通过合理使用 Redis 哈希结构,可以显著提高系统的性能和响应速度。在实际开发中,结合具体业务需求,灵活运用 Redis 提供的多种数据结构,构建高效的缓存和数据存储解决方案。希望本文能帮助您更好地理解和应用 Redis 哈希结构,提升数据检索速度。
263 18
|
11月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
263 11