Files

479 lines
30 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第七部分:数据库设计
## 7.1 MySQL数据库设计
### 7.1.1 用户相关表
```sql
-- ============================================================
-- 用户表 (users)
-- ============================================================
CREATE TABLE `users` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`uuid` CHAR(36) NOT NULL COMMENT '用户UUID',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号(加密存储)',
`email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱(加密存储)',
`password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希(bcrypt',
`salt` VARCHAR(32) NOT NULL COMMENT '密码盐值',
`nickname` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '昵称',
`avatar` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '头像URL',
`gender` TINYINT NOT NULL DEFAULT 0 COMMENT '性别:0未知 1男 2女',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1正常 2待验证',
`register_source` VARCHAR(20) NOT NULL DEFAULT 'web' COMMENT '注册来源',
`register_ip` VARCHAR(45) NOT NULL DEFAULT '' COMMENT '注册IP',
`last_login_at` DATETIME DEFAULT NULL COMMENT '最后登录时间',
`last_login_ip` VARCHAR(45) DEFAULT NULL COMMENT '最后登录IP',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME DEFAULT NULL COMMENT '软删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_uuid` (`uuid`),
UNIQUE KEY `uk_phone` (`phone`),
UNIQUE KEY `uk_email` (`email`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- ============================================================
-- 设备表 (devices)
-- ============================================================
CREATE TABLE `devices` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '设备ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`device_id` VARCHAR(64) NOT NULL COMMENT '设备唯一标识(硬件指纹)',
`device_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '设备名称',
`device_type` VARCHAR(20) NOT NULL COMMENT '设备类型:windows/mac/android/ios',
`os_version` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '系统版本',
`client_version` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '客户端版本',
`push_token` VARCHAR(255) DEFAULT NULL COMMENT '推送Token',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1正常',
`last_active_at` DATETIME DEFAULT NULL COMMENT '最后活跃时间',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_device` (`user_id`, `device_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_device_id` (`device_id`),
KEY `idx_last_active` (`last_active_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备表';
-- ============================================================
-- 会员表 (memberships)
-- ============================================================
CREATE TABLE `memberships` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '会员ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`plan_id` VARCHAR(50) NOT NULL COMMENT '套餐ID',
`plan_name` VARCHAR(100) NOT NULL COMMENT '套餐名称',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0过期 1有效 2暂停',
`start_at` DATETIME NOT NULL COMMENT '开始时间',
`expire_at` DATETIME NOT NULL COMMENT '过期时间',
`auto_renew` TINYINT NOT NULL DEFAULT 0 COMMENT '是否自动续费',
`total_traffic` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '总流量(字节)',
`used_traffic` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '已用流量(字节)',
`device_limit` INT NOT NULL DEFAULT 1 COMMENT '设备数量限制',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_expire_at` (`expire_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员表';
-- ============================================================
-- 订单表 (orders)
-- ============================================================
CREATE TABLE `orders` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '订单号',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`plan_id` VARCHAR(50) NOT NULL COMMENT '套餐ID',
`plan_name` VARCHAR(100) NOT NULL COMMENT '套餐名称',
`amount` DECIMAL(10,2) NOT NULL COMMENT '订单金额',
`currency` VARCHAR(3) NOT NULL DEFAULT 'CNY' COMMENT '货币类型',
`pay_method` VARCHAR(20) NOT NULL COMMENT '支付方式:alipay/wechat/apple',
`pay_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '实付金额',
`pay_time` DATETIME DEFAULT NULL COMMENT '支付时间',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0待支付 1已支付 2已取消 3已退款',
`coupon_id` BIGINT DEFAULT NULL COMMENT '优惠券ID',
`discount_amount` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '优惠金额',
`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`expired_at` DATETIME DEFAULT NULL COMMENT '过期时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`),
KEY `idx_pay_time` (`pay_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
```
### 7.1.2 节点相关表
```sql
-- ============================================================
-- 节点表 (nodes)
-- ============================================================
CREATE TABLE `nodes` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '节点ID',
`node_id` VARCHAR(50) NOT NULL COMMENT '节点标识',
`name` VARCHAR(100) NOT NULL COMMENT '节点名称',
`region` VARCHAR(20) NOT NULL COMMENT '区域:china/asia/europe/america',
`country` VARCHAR(10) NOT NULL COMMENT '国家代码',
`city` VARCHAR(50) NOT NULL COMMENT '城市',
`isp` VARCHAR(20) NOT NULL COMMENT '运营商:telecom/unicom/mobile/bgp',
`ip` VARCHAR(45) NOT NULL COMMENT '节点IP',
`port` INT NOT NULL DEFAULT 8000 COMMENT '服务端口',
`type` VARCHAR(20) NOT NULL COMMENT '类型:access/relay/exit',
`capacity` INT NOT NULL DEFAULT 10000 COMMENT '最大连接数',
`current_load` INT NOT NULL DEFAULT 0 COMMENT '当前连接数',
`bandwidth_mbps` INT NOT NULL DEFAULT 1000 COMMENT '带宽(Mbps',
`used_bandwidth_mbps` INT NOT NULL DEFAULT 0 COMMENT '已用带宽',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0离线 1在线 2维护',
`quality_score` DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT '质量评分',
`latitude` DECIMAL(10,7) DEFAULT NULL COMMENT '纬度',
`longitude` DECIMAL(10,7) DEFAULT NULL COMMENT '经度',
`cloud_provider` VARCHAR(20) DEFAULT NULL COMMENT '云服务商',
`line_type` VARCHAR(20) NOT NULL DEFAULT 'bgp' COMMENT '线路类型',
`is_dedicated` TINYINT NOT NULL DEFAULT 0 COMMENT '是否专线',
`supported_games` JSON DEFAULT NULL COMMENT '支持的游戏列表',
`config` JSON DEFAULT NULL COMMENT '节点配置',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_node_id` (`node_id`),
KEY `idx_region` (`region`),
KEY `idx_country_city` (`country`, `city`),
KEY `idx_status` (`status`),
KEY `idx_type` (`type`),
KEY `idx_quality_score` (`quality_score`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点表';
-- ============================================================
-- 线路表 (routes)
-- ============================================================
CREATE TABLE `routes` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '线路ID',
`route_id` VARCHAR(50) NOT NULL COMMENT '线路标识',
`game_id` VARCHAR(50) NOT NULL COMMENT '游戏ID',
`source_region` VARCHAR(50) NOT NULL COMMENT '源区域',
`dest_region` VARCHAR(50) NOT NULL COMMENT '目标区域',
`access_node_id` VARCHAR(50) NOT NULL COMMENT '接入节点ID',
`relay_node_ids` JSON DEFAULT NULL COMMENT '中转节点ID列表',
`exit_node_id` VARCHAR(50) NOT NULL COMMENT '出口节点ID',
`protocol` VARCHAR(20) NOT NULL DEFAULT 'udp_relay' COMMENT '协议',
`priority` TINYINT NOT NULL DEFAULT 0 COMMENT '优先级',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`avg_latency` DECIMAL(8,2) DEFAULT NULL COMMENT '平均延迟',
`avg_loss` DECIMAL(5,4) DEFAULT NULL COMMENT '平均丢包率',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_route_id` (`route_id`),
KEY `idx_game_id` (`game_id`),
KEY `idx_source_region` (`source_region`),
KEY `idx_dest_region` (`dest_region`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='线路表';
```
### 7.1.3 游戏相关表
```sql
-- ============================================================
-- 游戏表 (games)
-- ============================================================
CREATE TABLE `games` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '游戏ID',
`game_id` VARCHAR(50) NOT NULL COMMENT '游戏标识',
`name` VARCHAR(100) NOT NULL COMMENT '游戏名称',
`name_en` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '英文名',
`icon` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '图标URL',
`category` VARCHAR(30) NOT NULL COMMENT '分类:fps/moba/mmorpg/rts/other',
`platform` VARCHAR(20) NOT NULL DEFAULT 'pc' COMMENT '平台:pc/mobile/console',
`is_popular` TINYINT NOT NULL DEFAULT 0 COMMENT '是否热门',
`is_enabled` TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用',
`process_names` JSON DEFAULT NULL COMMENT '进程名列表',
`server_config` JSON DEFAULT NULL COMMENT '服务器配置',
`default_protocol` VARCHAR(20) NOT NULL DEFAULT 'udp_relay' COMMENT '默认协议',
`priority` TINYINT NOT NULL DEFAULT 0 COMMENT '优先级',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序',
`description` TEXT COMMENT '描述',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_game_id` (`game_id`),
KEY `idx_category` (`category`),
KEY `idx_is_popular` (`is_popular`),
KEY `idx_sort_order` (`sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='游戏表';
-- ============================================================
-- 游戏服务器表 (game_servers)
-- ============================================================
CREATE TABLE `game_servers` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '服务器ID',
`game_id` VARCHAR(50) NOT NULL COMMENT '游戏ID',
`name` VARCHAR(100) NOT NULL COMMENT '服务器名称',
`region` VARCHAR(20) NOT NULL COMMENT '区域',
`ip` VARCHAR(45) NOT NULL COMMENT '服务器IP',
`ip_range` VARCHAR(18) DEFAULT NULL COMMENT 'IP段',
`port` INT DEFAULT NULL COMMENT '端口',
`protocol` VARCHAR(10) NOT NULL DEFAULT 'udp' COMMENT '协议',
`location` JSON DEFAULT NULL COMMENT '地理位置',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_game_id` (`game_id`),
KEY `idx_region` (`region`),
KEY `idx_ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='游戏服务器表';
```
### 7.1.4 测速与日志表
```sql
-- ============================================================
-- 测速记录表 (speed_tests)
-- ============================================================
CREATE TABLE `speed_tests` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`node_id` VARCHAR(50) NOT NULL COMMENT '节点ID',
`game_id` VARCHAR(50) DEFAULT NULL COMMENT '游戏ID',
`rtt` DECIMAL(8,2) NOT NULL COMMENT '延迟(ms',
`jitter` DECIMAL(8,2) NOT NULL COMMENT '抖动(ms',
`loss_rate` DECIMAL(5,4) NOT NULL COMMENT '丢包率',
`bandwidth_mbps` DECIMAL(10,2) DEFAULT NULL COMMENT '带宽(Mbps',
`score` DECIMAL(5,2) NOT NULL COMMENT '评分',
`client_ip` VARCHAR(45) NOT NULL COMMENT '客户端IP',
`isp` VARCHAR(20) DEFAULT NULL COMMENT '运营商',
`city` VARCHAR(50) DEFAULT NULL COMMENT '城市',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_node_id` (`node_id`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测速记录表';
-- ============================================================
-- 加速会话表 (sessions)
-- ============================================================
CREATE TABLE `sessions` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '会话ID',
`session_id` VARCHAR(64) NOT NULL COMMENT '会话标识',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`device_id` VARCHAR(64) NOT NULL COMMENT '设备ID',
`game_id` VARCHAR(50) NOT NULL COMMENT '游戏ID',
`node_id` VARCHAR(50) NOT NULL COMMENT '节点ID',
`route_id` VARCHAR(50) DEFAULT NULL COMMENT '线路ID',
`protocol` VARCHAR(20) NOT NULL COMMENT '协议',
`start_at` DATETIME NOT NULL COMMENT '开始时间',
`end_at` DATETIME DEFAULT NULL COMMENT '结束时间',
`duration` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '时长(秒)',
`total_bytes_up` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '上行流量(字节)',
`total_bytes_down` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '下行流量(字节)',
`avg_latency` DECIMAL(8,2) DEFAULT NULL COMMENT '平均延迟',
`avg_loss` DECIMAL(5,4) DEFAULT NULL COMMENT '平均丢包率',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0异常断开 1正常结束 2进行中',
`disconnect_reason` VARCHAR(50) DEFAULT NULL COMMENT '断开原因',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_session_id` (`session_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_game_id` (`game_id`),
KEY `idx_start_at` (`start_at`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='加速会话表';
-- ============================================================
-- 操作日志表 (operation_logs)
-- ============================================================
CREATE TABLE `operation_logs` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '用户ID',
`admin_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '管理员ID',
`action` VARCHAR(50) NOT NULL COMMENT '操作类型',
`resource` VARCHAR(50) NOT NULL COMMENT '资源类型',
`resource_id` VARCHAR(50) DEFAULT NULL COMMENT '资源ID',
`detail` JSON DEFAULT NULL COMMENT '详情',
`ip` VARCHAR(45) NOT NULL COMMENT '操作IP',
`user_agent` VARCHAR(255) DEFAULT NULL COMMENT 'UserAgent',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_admin_id` (`admin_id`),
KEY `idx_action` (`action`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
```
### 7.1.5 风控相关表
```sql
-- ============================================================
-- 风控事件表 (risk_events)
-- ============================================================
CREATE TABLE `risk_events` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`event_type` VARCHAR(30) NOT NULL COMMENT '事件类型:abnormal_login/shared_account/ddos',
`risk_level` TINYINT NOT NULL COMMENT '风险等级:1低 2中 3高',
`detail` JSON DEFAULT NULL COMMENT '详情',
`ip` VARCHAR(45) NOT NULL COMMENT 'IP',
`device_id` VARCHAR(64) DEFAULT NULL COMMENT '设备ID',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0待处理 1已处理 2已忽略',
`handle_admin_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '处理管理员ID',
`handle_at` DATETIME DEFAULT NULL COMMENT '处理时间',
`handle_remark` VARCHAR(255) DEFAULT NULL COMMENT '处理备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_event_type` (`event_type`),
KEY `idx_risk_level` (`risk_level`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='风控事件表';
-- ============================================================
-- 黑名单表 (blacklist)
-- ============================================================
CREATE TABLE `blacklist` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`type` VARCHAR(20) NOT NULL COMMENT '类型:ip/device/user',
`value` VARCHAR(100) NOT NULL COMMENT '',
`reason` VARCHAR(255) NOT NULL COMMENT '原因',
`expire_at` DATETIME DEFAULT NULL COMMENT '过期时间',
`admin_id` BIGINT UNSIGNED NOT NULL COMMENT '操作管理员ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_type_value` (`type`, `value`),
KEY `idx_expire_at` (`expire_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='黑名单表';
```
### 7.1.6 索引设计说明
```
┌──────────────────────────────────────────────────────────────────┐
│ 索引设计原则 │
├──────────────────────────────────────────────────────────────────┤
│ │
│ 1. 主键索引:所有表使用自增BIGINT作为主键 │
│ │
│ 2. 唯一索引: │
│ - 业务唯一标识(uuid, node_id, game_id, order_no等) │
│ - 防止重复数据 │
│ │
│ 3. 普通索引: │
│ - 查询频繁的字段(user_id, status, created_at等) │
│ - 组合索引遵循最左前缀原则 │
│ │
│ 4. 索引优化: │
│ - 避免在频繁更新的列上建索引 │
│ - 控制单表索引数量(不超过5个) │
│ - 使用覆盖索引优化查询 │
│ │
│ 5. 分库分表策略: │
│ ┌──────────────┬──────────────┬──────────────────────────┐ │
│ │ 表名 │ 分表策略 │ 说明 │ │
│ ├──────────────┼──────────────┼──────────────────────────┤ │
│ │ sessions │ 按月分表 │ 数据量大,按月归档 │ │
│ │ speed_tests │ 按月分表 │ 数据量大,按月归档 │ │
│ │ operation_logs│ 按月分表 │ 日志类,按月归档 │ │
│ │ risk_events │ 按季度分表 │ 数据量适中 │ │
│ │ orders │ 按年分表 │ 订单数据,按年归档 │ │
│ │ 其他表 │ 不分表 │ 数据量可控 │ │
│ └──────────────┴──────────────┴──────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘
```
## 7.2 Redis设计
```
┌──────────────────────────────────────────────────────────────────┐
│ Redis 数据结构设计 │
├──────────────────────────────────────────────────────────────────┤
│ │
│ 1. 用户会话缓存 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Key: session:{session_id} │ │
│ │ Type: Hash │ │
│ │ Fields: │ │
│ │ user_id: 用户ID │ │
│ │ device_id: 设备ID │ │
│ │ node_id: 节点ID │ │
│ │ game_id: 游戏ID │ │
│ │ start_at: 开始时间 │ │
│ │ status: 状态 │ │
│ │ TTL: 24小时 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 2. 节点状态缓存 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Key: node:{node_id}:status │ │
│ │ Type: Hash │ │
│ │ Fields: │ │
│ │ load: 当前负载 │ │
│ │ rtt: 平均延迟 │ │
│ │ loss: 丢包率 │ │
│ │ jitter: 抖动 │ │
│ │ score: 评分 │ │
│ │ last_heartbeat: 最后心跳时间 │ │
│ │ TTL: 60秒(心跳超时) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 3. Token缓存 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Key: token:{user_id} │ │
│ │ Type: String │ │
│ │ Value: JWT Token │ │
│ │ TTL: 2小时 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 4. 验证码缓存 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Key: sms:{phone} │ │
│ │ Type: String │ │
│ │ Value: 验证码 │ │
│ │ TTL: 5分钟 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 5. 限流计数器 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Key: rate:{api}:{ip} │ │
│ │ Type: String (INCR) │ │
│ │ Value: 计数 │ │
│ │ TTL: 1分钟 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 6. 节点评分排行榜 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Key: nodes:{region}:ranking │ │
│ │ Type: Sorted Set │ │
│ │ Member: node_id │ │
│ │ Score: quality_score │ │
│ │ TTL: 5分钟 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 7. 在线用户统计 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Key: online:users │ │
│ │ Type: HyperLogLog │ │
│ │ 功能: UV统计(去重计数) │ │
│ │ TTL: 永不过期 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 8. 游戏配置缓存 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Key: game:{game_id}:config │ │
│ │ Type: String (JSON) │ │
│ │ Value: 游戏完整配置 │ │
│ │ TTL: 1小时 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘
```