活动营销系统

news/2025/2/12 15:46:37/文章来源:https://www.cnblogs.com/json-92/p/18710317

一、整体架构图

二、核心业务系统介绍

2.1.接入层统一异常处理逻辑

 

2.2.邀请服务逻辑

 

2.3.权益发放服务

 

 

2.4.排行榜服务

2.4.1.榜单服务数据结构

数据结构分为两块:

  1. 配置中心数据,因为排行榜没有后台配置平台,只能将配置数据放到配置中心,具备实时更改配置的能力
  2. 数据表,主要是排行榜核心数据结构
--  配置中心信息
榜单配置信息数据:
{"rank_code": {"name": "榜单名称","rank_type": "用于榜单归类","rank_default": {"rank_alias": "default","rank_biz_id": "默认榜单筛选条件:能量值","rank_sub_biz_id": "none,对应过滤值"},"rank_children": [{"rank_alias": "出行能量值:consumption","rank_sub_biz_id": "consumption"},{"rank_alias": "邀请能量值:invite","rank_sub_biz_id": "invite"}],"rand_period": [{"periodType": "day"},{"periodType": "week"},{"periodType": "month"},{"periodType": "year"},{"periodType": "range"}],"beginTime": "开始时间","endTime": "结束时间"}
}
 
榜单周期id:
day:当前日期yyyy-MM-dd;
week:w-当前周第一天;
month:yyyy-MM;
year:yyyy;
rang: 开始时间-结束时间,
 
-- 数据库表结构


CREATE TABLE `activity_rank_data_source_detail` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',`request_id` varchar(128) NOT NULL DEFAULT '' COMMENT '唯一键',`entity_id` varchar(64) NOT NULL DEFAULT '' COMMENT '实体id',`entity_type` smallint(6) NOT NULLactivity_rank_period_count DEFAULT '0' COMMENT '实体类型,1:用户id',`entity_data_real_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '该数据发生的真实时间',`entity_data_biz_id` varchar(128) NOT NULL DEFAULT '' COMMENT '业务线,1:能量值',`entity_data_sub_biz_id` varchar(128) NOT NULL DEFAULT '' COMMENT '二级业务:能耗、助力',`entity_data_num` int(11) NOT NULL DEFAULT '0' COMMENT '数据大小',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_request_id` (`request_id`),KEY `idx_biz_id` (`entity_data_biz_id`,`entity_data_sub_biz_id`,`entity_id`,`entity_data_real_time`,`entity_data_num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动榜单-榜单数据更新明细';CREATE TABLE `activity_rank_period_count` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',`rank_biz_id` varchar(128) NOT NULL DEFAULT '' COMMENT '榜单业务id',`rank_sub_biz_id` varchar(128) NOT NULL DEFAULT '' COMMENT '榜单业务id',`rank_code` varchar(128) NOT NULL DEFAULT '' COMMENT '榜单code',`rank_name` varchar(128) NOT NULL DEFAULT '' COMMENT '榜单名称',--待定`entity_id` varchar(64) NOT NULL DEFAULT '' COMMENT '实体id',`entity_type` smallint(6) NOT NULL DEFAULT '0' COMMENT '实体类型,1:用户id',`period_type` smallint(6) NOT NULL DEFAULT '0' COMMENT '周期类型,1:日、2:周、3:月,4:年、5:固定区间',`period_id` varchar(64) NOT NULL DEFAULT '' COMMENT '周期唯一code',`period_begin_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '周期开始时间,所有的周期开始-结束时间为左闭右开',`period_count` int(11) NOT NULL DEFAULT '0' COMMENT '周期统计数值',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_period_entity_id` (`rank_biz_id`,`period_id`,`entity_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动榜单-榜单周期数据统计';

  

2.4.2.榜单服务更新流程


说明:
    1. redis中会缓存一份topN的数据
      1. 更新时机
        1. 用户数据变更时,实时更新
        2. 定时从DB中加载对应的topN数据
      2. topN数据只能根据统计后的用户-周期数据进行更新。

 

redis内存数据结构:
rank_source_biz_id(榜单类型)_day(周期类型)_period_code: zset
rank_top_biz_id(榜单类型)_day(周期类型)_period_code(当前): List<String> ,user_id,能量值,排名  
数据注意事项:
  1. rank_source_xxx避免元素数量过多(目前暂时忽略,元素个数在1w以内)
  2. rank_top_xxx
    1. 并列排名的问题,topN实际元素可能是N+n (是否要做限制)

2.4.3.多维度榜单设计

zset value:

long 类型 最大值为: 111111111111111111111111111111111111111111111111111111111111111  63位
value需要包括: 排行榜值count 和 时间戳
所以我们可以根据我们业务的值来选择 使用多少bit位来表示排行榜值,和时间戳
假如我们业务内,count取值范围在0-10000, 时间戳在 2025-01-01 00:00:00~ 2026-01-01 00:00:00
那么我们可以这样设计
10000的二进制表示为: 10011100010000 共14位
2025-01-01 00:00:00 日期表示
毫秒级: 11001010000011101011100100000100000000000 41 位
秒: 1100111011101000001010100000000 31 位


2026-01-01 00:00:00 日期表示

毫秒级: 11001101101110101001000110011010000000000 41 位
秒: 1101001010101010100100010000000 31 位

所以说如果表示这一年时间,我们最多可以使用41位 ,假设我们在榜单上配置一个基准时间,例如,就是2025-01-01 00:00:00 的毫秒,
那么存储时间,就可以设置为该基准时间的相对时间,
2026-01-01 00:00:00 和2025-01-01 00:00:00 之间最大时间差为:
11101010111101100010010110000000000 共 35位
如果只精确到秒:1111000010011001110000000 共 25位

这是我们就可以在一个用一个long类型数据表示这两部分数据
高位用15位表示 count ,低位用40位表示时间.

以 count = 1000,time = 2025-06-01 10:12:30 基准时间为:2025-01-01 00:00:00 ,精确秒来计算:
合并计算:
//偏移位数
int timeShift = 45;
Date date1 = DateUtil.parse("2025-01-01 00:00:00", DatePattern.NORM_DATETIME_FORMAT);
Date date2 = DateUtil.parse("2025-06-01 10:12:30", DatePattern.NORM_DATETIME_FORMAT);
long diff =Long.valueOf(( date2.getTime() -date1.getTime()) /1000);
int count = 1000;

long result = 0L;
result = (result | count) << timeShift;
result = result | diff;
System.out.println("001:"+Long.toBinaryString(result));
//反解析
int count1 = (int)(result >> 45);
long diff1 = result^((count1 | 0L)<<45);
System.out.println("002:"+Long.toBinaryString(count1));
System.out.println("022:"+Long.toBinaryString((count1 | 0L) << timeShift));
System.out.println("003:"+ Long.toBinaryString(diff));
System.out.println("004:"+ Long.toBinaryString(diff1));

 

三、服务治理

 

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

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

相关文章

004 条件渲染

1、v-ifv-if指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回true值的时候被渲染。<p v-if="flag">我是孙猴子</p>data(){return{flag:true}} 2、v-else你可以使用 v-else 指令来表示 v-if 的"else块"<p v-if="flag&quo…

Tinyfox 简易教程之:Hello World!

Tinyfox程序设计系列教程之入门篇一,什么是 Tinyfox: Tinyfox 是一款自带 HTTP 服务器的以 WebApi、WebSocket 及“动态HTML”为核心功能的超轻量级的独立性极强的高性能 Web 应用程序基础框架。 Tinyfox 简单易用,性能强劲,跨平台,既支持 Linux 也支持 Windows,既支持 x…

中电金信:更智能、更精准、更专业,中电金信AI产品全栈接入DeepSeek

短短两周的时间,AI届新星DeepSeek凭借低成本、高性能和开源策略,以“中国速度”席卷全网,逆袭成为全球用户量增速最快的AI模型。作为大模型领域的一匹黑马,DeepSeek为千行百业提供了AI解决方案的新选择。2025年开工首日,中电金信研究院便第一时间在产品平台、智能应用、智…

deepseek基础篇--本地知识库推理

一.Ollama 搜索安装 dmeta-embedding-zh https://ollama.com/shaw/dmeta-embedding-zh dmeta-embedding-zh 是一个仅含 4 亿参数的中文嵌入模型,适用于多种场景。它在 MTEB 基准测试中表现出色,尤其适合语义检索、RAG 和其他 LLM 应用。 安装成功 二、使用工具 Cherry Studi…

认识嵌入式开发需要的设备

认识嵌入式开发需要的设备开发板 Arduino用于快速原型设计和学习嵌入式系统基础树莓派用于学习Linux嵌入式系统和复杂应用开发STM32开发板用于学习ARM Cortex-M系列微控制器的开发ESP32开发板用于学习Wi-Fi和蓝牙等无线通信技术的开发GD32开发板调试工具 示波器观察电信号的波形…

nging Go语言Web管理面板docker-compose部署测试

Nging是一个网站服务程序,可以管理和配置 Caddy 和 Nginx 站点,并附带了实用的周边工具,例如:计划任务、MySQL管理、Redis管理、FTP管理、SSH管理、服务器管理等。Nging是一个网站服务程序,可以管理和配置 Caddy 和 Nginx 站点,并附带了实用的周边工具,例如:计划任务、…

近端策略优化(PPO)算法的理论基础与PyTorch代码详解

近端策略优化(Proximal Policy Optimization, PPO)算法作为一种高效的策略优化方法,在深度强化学习领域获得了广泛应用。特别是在大语言模型(LLM)的人类反馈强化学习(RLHF)过程中,PPO扮演着核心角色。本文将深入探讨PPO的基本原理和实现细节。 PPO属于在线策略梯度方法的范畴…

定制化训练DeepSeek模型:LoAR、COT推理与SFT技术应用

DeepSeek-R1 模型微调系列DeepSeek-R1 模型微调系列一. 前言介绍本文内容:1.1 项目背景1.2 LoRA和 QLoRA 简介1.3 LLaMA 架构和 Qwen 架构LLaMA 架构Qwen 架构二. 环境准备2.1 Unsloth 安装(显卡版本-暂时不用)2.2 创建Python项目2.3 python 依赖库2.2 LoRA peft 安装2.3 Wa…

Ubuntu Linux部署DeepSeek(转载用于学习)

合集 - DeepSeek(4)1.Ubuntu Linux部署DeepSeek02-062.Windows11本地部署DeepSeek加速02-073.DeepSeek部署本地知识库02-084.DeepSeek+Zotero02-11收起 技术背景 DeepSeek是这段时间最热门的话题之一,其蒸馏模型可以实现低成本而高质量的推理,使得我们现在可以在本地小型化的…

deepseek 本地搭建 知识库 使用gpu cpu

下载安装LM Studio官网地址: https://lmstudio.ai/如图,下载完成直接下一步下一步安装即可. 不能飞行上网就用这个网站下载模型 https://hf-mirror.com/Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发…

车辆电子档案系统

在高阶自动驾驶场景和MaaS(Mobility as a Service)业务中,自动驾驶车辆的状态直接关系到整体运营的安全和效率。因此,拥有一套多维度预测、分析车辆指标的电子档案系统显得尤为重要。经纬恒润研发的车辆电子档案是汇总整车各类数据详细信息、对车辆上各项指标进行分析预测及…

九. 计算机网络

计算机网络 一. 硬件设备层级 设备物理层设备 中继器、集线器(是一种多端口的中继器)数据链路层设备 网桥、交换机(是一种多端口的网桥)网络层设备 路由器应用层设备 网关集线器不能自动寻址、集线器可以检测发送冲突。物理层不能隔离广播域和冲突域(也就是所有的端口都是…