基於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; } } }
具體還在整理,後續將其補全~
相關文章
- 大資料Storm 之RCE實踐大資料ORM
- 基於雲原生的大資料實時分析方案實踐大資料
- PB級資料實時查詢,滴滴Elasticsearch多叢集架構實踐Elasticsearch架構
- Iceberg 資料治理及查詢加速實踐
- 基於 Spark 的資料分析實踐Spark
- 基於 DataLakeAnalytics 的資料湖實踐
- 基於DataLakeAnalytics的資料湖實踐
- 基於 Flink 的小米資料整合實踐
- 大資料6.1 - 實時分析(storm和kafka)大資料ORMKafka
- 打造實時資料整合平臺——DataPipeline基於Kafka Connect的應用實踐APIKafka
- 如何使用 Milvus 向量資料庫實現實時查詢資料庫
- 小米 A/B 實驗場景基於 Apache Doris 的查詢提速最佳化實踐Apache
- 基於媒體查詢和 rem 的響應式佈局實踐REM
- 基於 MySQL Binlog 的 Elasticsearch 資料同步實踐MySqlElasticsearch
- 基於 Flink 的實時數倉生產實踐
- SSH:hiberate實現資料的查詢(單查詢和全查詢)
- 基於 MongoTemplate 實現MongoDB的複雜查詢MongoDB
- Go語言專案實戰:基於開源資料的成語查詢Go
- 關於Oracle資料庫的時間查詢Oracle資料庫
- 基於 Flink CDC 的現代資料棧實踐
- 基於Greenplum,postgreSQL的大型資料倉儲實踐SQL
- 概括SQL Server實時查詢Oracle資料庫WSSQLServerOracle資料庫
- 使用Storm、Kafka和ElasticSearch處理實時資料 -javacodegeeksORMKafkaElasticsearchJava
- 基於redis實現定時任務Redis
- 基於REDIS實現延時任務Redis
- Mysql資料實時同步實踐MySql
- 錢大媽基於 Flink 的實時風控實踐
- 快手基於 Apache Flink 的實時數倉建設實踐Apache
- 基於PostgreSQL實時干預搜尋排序實踐SQL排序
- 【Flink】基於 Flink 的流式資料實時去重
- 基於資料庫、redis和zookeeper實現的分散式鎖資料庫Redis分散式
- ES 20 - 查詢Elasticsearch中的資料 (基於DSL查詢, 包括查詢校驗match + bool + term)Elasticsearch
- Hadoop - 實時查詢DrillHadoop
- SQL Server實戰四:查詢資料庫的資料SQLServer資料庫
- Elasticsearch從0到千萬級資料查詢實踐(非轉載)Elasticsearch
- 複雜查詢響應速度提升10+倍,度言軟體基於 Apache Doris 實時數倉建設實踐Apache
- KLOOK客路旅行基於Apache Hudi的資料湖實踐Apache
- 基於Apache Hudi + Flink的億級資料入湖實踐Apache
- 從Storm到Flink,有贊五年實時計算效率提升實踐ORM