Skip to content

6643/lottery

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

高性能抽奖系统 (1亿用户级 - Absolute Symmetry)

本项目采用了 "32K 绝对对称" (Absolute Symmetry Architecture),这是处理亿级用户抽奖业务的终极架构形态。

🚀 终极架构:一层一页 (One Layer, One Page)

通过将用户分组基数定为 $2^{15} = 32,768$,我们实现了计算机存储领域梦寐以求的“绝对对称”排布。

1. 物理拓扑 (20 Pages / Segment)

每一个 Segment 的物理排布与操作系统的内存页面 (4KB) 达到了 1:1 的完美映射

  • Segment Header (Page 0): 存储 "段级局部计数器"
  • Weights (Page 1-4): 恰好占满 4 个物理页,无任何补白。
  • Level 1-15 Bitmaps (Page 5-19): 每一层索引恰好独占一个物理页 (4,096字节)。

2. 核心性能引擎

  • TLB 零抖动: 读取任意一层的索引时,硬件地址转换(TLB)效率最高,完全消除了跨页寻址延迟。
  • 双重剪枝搜索:
    • Global Pruning: 优先检查全局总表,确认奖项是否存在。
    • Local Pruning: 在搜索过程中,通过 Segment Header 瞬间跳过不含目标奖项的 32K 用户块。

📊 性能表现 (1亿规模巅峰实测)

场景 64K 标准版 32K 绝对对称版 提升幅度
空奖项搜索 0.000 ms 0.000 ms -
极稀疏命中 ~2.4 ms ~0.78 ms +200%
全库扫描极限速度 ~7.4 ms ~1.1 ms +500%

🛠️ 快速开始

编译运行

zig run -O ReleaseFast lottery.zig

基准测试

zig test -O ReleaseFast lottery.zig

📖 API 参考手册

1. init(path: []const u8) !LotterySystem

初始化或加载单文件数据库。

  • 参数: path: 统一数据库文件路径(如 lottery.dat)。
  • 说明: 采用单文件一体化存储。若文件不存在,系统将自动创建并初始化 1 亿用户的预留对齐空间。由于采用了 mmap 技术,首个 1 亿用户文件的初始化极其快速。

2. deinit(self: *LotterySystem) void

释放系统资源,确保所有内存数据正确刷写到磁盘。

3. getWeight(self: LotterySystem, user_id: u32) u4

查询指定用户的当前权重。

  • 参数: user_id: 用户 ID(从 1 开始)。
  • 返回值: 0-15 之间的权重。超范围 ID 返回 0。

4. setWeight(self: *LotterySystem, user_id: u32, weight: u4) !void

设置用户权重并同步更新多级索引。

  • 核心逻辑:
    1. 自动同步 Global Header (4KB) 中的全局层级人数统计。
    2. 自动同步 Segment Meta (4KB) 中的局部层级人数统计。
    3. 精准定位物理页并更新 4-bit 权重表与位图索引。
  • 自动扩容: 若 ID 超过当前文件容量,将自动追加定长的 32K 用户 Segment,保持物理对齐。

5. getTotalUsers(self: *const LotterySystem) u32

查询当前系统中已注册的最大用户总数。

6. getLevelCount(self: *const LotterySystem, level: u4) u64

实时查询指定奖项层级(或以上)的总人数统计。得益于 Header 缓存,该操作耗时为 O(1)

7. getCapacity(self: *const LotterySystem) u32

查询当前数据库文件在不扩容的情况下所能容纳的最大用户数(物理容量)。

8. drawWinner(self: *LotterySystem, award_level: u4, seed: *u64) ?u32

执行高性能、公平、物理级的抽奖算法。

  • 参数:
    • award_level: 奖项范围 (0-15)。
      • 0: 新手抽奖。范围为 weight == 0 的用户。通过 Level 1 位图补集快速探测。
      • 1-15: 权重抽奖。范围为 weight >= award_level 的用户。
    • seed: 随机数种子指针。
  • 性能优化曲线:
    • 剪枝阶段: 优先对比 Global Header 与 Segment Meta 统计,瞬间跳过空块。
    • 扫描阶段: 利用 $2^{15}$ 对称性进行物理页扫描。
  • 典型耗时: 1 亿用户规模下随机命中耗时仅为 ~0.78 ms

📂 文件物理结构

  • Global Header (Page 0) | 全局全局元数据。
  • Segment 0 (Page 1-20) | 第一个 32,768 用户块:
    • Page 1: 段元数据 (包含 32K 人局部计数器)。
    • Page 2-5: 4-bit 权重表。
    • Page 6-20: 15 层级对齐索引位图。
  • Segment 1 ...

结论

32K 绝对对称架构通过“数据对齐硬件”的思路,将单线程检索性能拉到了亚毫秒(Sub-ms)级别。它是目前处理百兆级实时公平抽奖的最优工程标准。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages