# 第七部分:数据库设计 ## 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小时 │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────────────┘ ```